如何将服务注入JUnit测试

时间:2019-10-08 15:25:10

标签: java spring junit

我想了解将服务注入JUnit测试的各种可能性/工具,因此我可以使用它而不必获取新实例(实际上我的服务是单例):

public class ServiceTest {

    // Service to inject
    private IMyService someService;

    @Test
    public void methodTest() {
        // test body ...
        assertTrue(someService.someServiceMethod());
    }
}

2 个答案:

答案 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-springhttps://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);
    }
}