我想写一个类和它在操作过程中调用的“下级”类的集成测试。我想模拟“下层”类调用的数据库连接,但是我还没有找到一种方法来做到这一点。
我有一个类,它调用另一个类,该类通过jdbcTemplate调用数据库。我想将模拟jdbcTemplate注入较低的类,但是我似乎将其注入到错误的类实例中。该代码遵循以下模板:
@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注入到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并注入A即可:
@RunWith(MockitoJUnitRunner.Silent.class)
public class aTestClass {
@Mock
B b;
@InjectMocks
A a;
@Test
public void aTest() {
a.someMethod();
}
}
不要在单元测试中模拟依赖项的依赖项。您不应该关心那里的较低级别。