我想编写一种类及其在操作期间调用的“较低”类的集成测试。我想模拟“较低”类调用的数据库连接,但我还没有找到方法来做到这一点。
我有一个类,它调用另一个类,它通过 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/