我想了解将服务注入JUnit测试的各种可能性/工具,因此我可以使用它而不必获取新实例(实际上我的服务是单例):
public class ServiceTest {
// Service to inject
private IMyService someService;
@Test
public void methodTest() {
// test body ...
assertTrue(someService.someServiceMethod());
}
}
答案 0 :(得分:2)
您可以使用JMockit 模拟工具包。 JMockit是一个用于在测试中模拟对象的Java框架(JUnit / TestNG)
请参见下面的示例
@RunWith(JMockit.class)
public class ServiceTest {
@Tested
private Service myService;
@Injectable
private AnotherService mockAnotherService;
@Test
public void methodTest() {
new Expectations() {{
mockAnotherService.someMethod("someValue"); result = true;
}};
assertTrue(myService.someMethod());
}
}
要测试的服务应使用@Tested注释。 如果要测试的服务调用了其他服务,则应使用@Injectable(模拟项)进行注释
在上面的示例中,myService.someMethod调用AnotherService.someMethod并传递字符串someValue。 JMockit运行myService的方法代码,当它到达mockAnotherService调用时,它将使该调用返回true
mockAnotherService.someMethod("someValue"); result = true;
阅读JMockit文档以获取更多信息。
答案 1 :(得分:2)
您可以使用依赖注入将Mockito模拟插入到Spring Bean中以进行单元测试。
查看以下内容:https://www.baeldung.com/injecting-mocks-in-spring和https://www.baeldung.com/java-spring-mockito-mock-mockbean
@ActiveProfiles("test")
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MocksApplication.class)
public class UserServiceTest {
@Autowired
private UserService userService;
@Autowired
private NameService nameService;
@Test
public void whenUserIdIsProvided_thenRetrievedNameIsCorrect() {
Mockito.when(nameService.getUserName("SomeId")).thenReturn("Mock user name");
String testName = userService.getUserName("SomeId");
Assert.assertEquals("Mock user name", testName);
}
}