2012-06-11 34 views
0

我总是想知道我应该测试我的代码的多少(单元测试)。我应该单元测试我的代码多少钱

比方说,我有这个组件:

@Stateless 
public class UserManager { 
    @PersistenceContext 
    EntityManager entityManager; 

    @Inject 
    Event<UserEvent> event; 

    public User getUserByUsername(String username) { 
     User user = entityManager 
        .createQuery("SELECT u FROM User u WHERE u.username = :username", User.class) 
        .setParameter("username", username) 
        .getSingleResult(); 
     event.fire(new UserEvent("some message")); 

     return user; 
    } 
} 

要真正彻底地测试它,我应该嘲笑事件和EntityManager的。 那我应该怎么做?

  • 验证entityManager上的createQuery方法只在给定的JPQL语句中调用一次。
  • 验证setParameter方法是否与给定参数一起被调用一次。
  • 确认方法getSingleResult只被调用一次。
  • 验证事件是否与给定参数一起被触发。
  • 测试是否返回了正确的用户。

全部?在我看来,这是非常有侵略性的,因为在我的测试中需要完成的变化中的每个小改动都会导致变化。

我有两个有点不同的问题,我认为是相关的。

Q2:在的Arquillian webiste,你可以看到这一点:

的Arquillian咱们你沟嘲笑和编写真正测试。

是否意味着我不应该使用模拟对象?怎么能(用arquillian)我真的彻底测试我的代码呢?

问题3:根据TDD,您应该先编写测试,然后再编写测试。但是如果你没有实现或api,你想怎么做,所以测试不会编译?

回答

1

我一直想知道我应该测试我的代码的多少(单元测试)。

如果您在DAL中没有业务逻辑,那么我会说:不要写(纯粹的)单元测试,写集成测试。先写集成测试测试。

我这样说,因为你做得很少,大多数有趣的东西发生在数据库或ORM中,这就是问题出现的地方。

我可能会考虑的唯一(纯粹的)单元测试就是显示事件被触发的单元测试。

我不知道Arquillian是如何工作的,并且考虑到需要少量的“世界”,我可能不会将它用于此测试。相反,我只是在测试方法中新增了一个EntityManager并将其传递给下面。我很可能会嘲笑Event<UserEvent>

这是否意味着我不应该使用模拟对象?

嘲笑(和其他假货)是一种工具。它们可能非常有用。但是他们不能解决所有问题,也不能用来测试每​​一件事情。

根据TDD,您应该先编写测试,然后再编写测试。但是,如果你没有实现或api,你想怎么做呢?

这些测试可以帮助你计算出API。

所以测试不会编译?

失败。修复失败并重新运行测试。

1

问题3:根据TDD,您应该先编写测试,然后再编写测试。但是如果你没有实现或api,你想怎么做,所以测试不会编译?

测试应编译但失败。您可以在类定义中存储方法,以便在编写测试时显示它们,但方法体在运行测试之前不应该执行。

相关问题