有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将服务注入junit测试

我想知道将服务注入JUnit测试的不同可能性/工具,这样我就可以使用它而无需获得新实例(事实上,我的服务是单例的):

public class ServiceTest {

    // Service to inject
    private IMyService someService;

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

共 (2) 个答案

  1. # 1 楼答案

    你可以使用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(mocks)注释这些服务

    在上面的例子中,myService。someMethod调用另一个服务。someMethod并传递字符串someValue。JMockit运行myService的方法代码,当它到达mockAnotherService调用时,它会使该调用返回true

    mockAnotherService.someMethod("someValue"); result = true;
    

    有关更多信息,请阅读JMockit文档

  2. # 2 楼答案

    您可以使用依赖注入将Mockito mock插入到Springbean中进行单元测试

    看这个: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);
        }
    }