testing - 我应该对我的代码进行多少单元测试

标签 testing mocking

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

假设我有这个组件:

@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;
    }
}

要真正彻底地测试它,我应该模拟 Event 和 EntityManager。 那我应该做哪一个?

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

全部?在我看来,这似乎非常具有侵入性,因为我的实现中的每一个小变化都会导致我的测试需要进行更改。

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

Q2:关于 arquillian webiste ,你可以阅读这个:

Arquillian let's you ditch the mocks and write real tests.

这是否意味着我不应该使用模拟对象?那么我如何才能(使用 arquillian)真正彻底地测试我的代码?

Q3:根据TDD,你应该先写测试再写实现。但是,如果您既没有实现也没有 API,那么测试将无法编译,您要怎么做呢?

最佳答案

I always wondered how much I should test my code (with unit tests).

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

我这么说是因为你做的很少,大部分有趣的事情都发生在数据库或 ORM 中,这就是问题的来源。

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

我不知道 Arquillian 是如何工作的,考虑到所需的“世界”数量很少,我可能不会将它用于此测试。相反,我只是新建一个 EntityManager在测试方法中并将其传递下去。我可能会 mock Event<UserEvent> .

Does it mean I shouldn't use mock objects?

模拟(和其他假货)是一种工具。它们可能非常有用。但它们并不能解决所有问题,也不应该用来测试所有事情。

According to TDD, you should write tests first and then the implementation. But how do you want to do it if you don't have either the implementation or the api

测试可帮助您制定 API。

so the tests won't compile?

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

关于testing - 我应该对我的代码进行多少单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10987355/

相关文章:

ruby-on-rails - 如何在 Rails 功能测试中使用 assert_select 来检查同一类型的多个元素,仅文本不同?

linux - 如何在终端中以静默模式运行 Mocha 测试

python - 通过引用而不是通过名称字符串修补对象?

python - 如何模拟类的方法返回值

iphone - 如何将我的 iPhone 应用程序的调试版本安装到我的 iPhone 上?

Python ldap 连接测试

python - pytest - 从测试中分离 fixture 逻辑

node.js - 模拟 Node.js 中测试的特定读取文件错误

android - 如何在创建 Activity 之前模拟方法?

typescript - 如何使用 Typescript 在 Jest 中模拟命名导出