java - 如何将模拟注入(inject)到距离测试类低两步的方法中

标签 java spring mockito

我想编写一种类及其在操作期间调用的“较低”类的集成测试。我想模拟“较低”类调用的数据库连接,但我还没有找到方法来做到这一点。

我有一个类,它调用另一个类,它通过 jdbcTemplate 调用数据库。我想将模拟 jdbcTemplate 注入(inject)到较低的类中,但我似乎将它注入(inject)到了该类的错误实例中。代码遵循此模板:

@Component
public class A {

    @AutoWired
    B b

    public String someMethod() {
        b.otherMethod();
    }

}


@Component
public class B {

    @AutoWired
    jdbcTemplate jdbctemplate

    public String otherMethod() {
        jdbctemplate.query(args);
    }

}

测试如下:

@RunWith(MockitoJUnitRunner.Silent.class)
public class aTestClass { 

    @Mock
    JdbcTemplate jdbcTemplate;

    @InjectMocks
    B b;

    @InjectMocks
    A a;

    @Test
    public void aTest() {
        a.someMethod();
    }
}

但是当我运行此测试时,我在 a.someMethod() 处收到 NullPointerException - 似乎被调用的 B 对象为 null。

问题是,如果我模拟 B,那么它永远不会真正调用 jdbcTemplate,因为它是一个模拟。

任何人都可以阐明如何将模拟 jdbcTemplate 注入(inject)到 A 调用的 B 对象吗?

最佳答案

如果您想要实际的集成测试:

1) 不要模拟模板..模拟整个存储库。

2) 在集成测试中您不需要 @InjectMocks。 Spring 执行 DI。

3) 由于这是 IT 测试,您需要使用 SpringRunner.class,而不是 MockitoJUnitRunner.class 运行器。

@RunWith(SpringRunner.class)
public class aTestClass { 

    @MockBean
    B b;

    @Autowired
    A a;

    @Test
    public void aTest() {
        a.someMethod();
    }
}

对于单元测试只需模拟 B 并注入(inject) A:

@RunWith(MockitoJUnitRunner.Silent.class)
public class aTestClass { 

    @Mock
    B b;

    @InjectMocks
    A a;

    @Test
    public void aTest() {
        a.someMethod();
    }
}

不要在单元测试中模拟依赖项的依赖项。您不应该关心那里的较低级别。

关于java - 如何将模拟注入(inject)到距离测试类低两步的方法中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55771861/

相关文章:

java - hibernate "where"查询仅适用于 id 字段

java - 这种 Spring 单例 bean 线程的设计是否安全?

java - 使用自定义参数匹配器第二次调用 Mockito.when 时的 NPE

java - 使用mockito的@InjectMocks绕过setter注入(inject)

spring - 我如何等待Mono完成,以便可以利用生成的值

unit-testing - 如果我使用 Mockito,我什至需要 Guice 吗?

java - 投票系统存在逻辑问题

java - jdk.dynalink 在 Java 9 的引导类路径中不可见

java - Google App Engine java OutOfMemoryError when putAll on memcache

java - 在 Spring Rest 模板中设置超时