【问题标题】:Spring test service class mocking utility class- Junit and MockitoSpring 测试服务类模拟实用程序类-Junit 和 Mockito
【发布时间】:2017-01-05 13:16:37
【问题描述】:

我想用Junit + Mockito.为spring框架的服务层编写测试用例

如何使用我的ServiceTest 类调用实际的服务层方法,如果我模拟ServiceTest 类,那么它的对象将不会执行实际的服务方法代码,因为它不会让对象调用它的方法,如果我尝试间谍仍然无法正常工作,@ 987654321@ 我仍然无法执行测试用例。

MyService.java

@Service
 public class MyService{

    @Autowired
    Utility utility;

    public String showResult(){

    String result = utility.getName();

    return result;
    }
    }

MyServiceTest.java

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(loader=AnnotationConfigWebContextLoader.class)
    @WebAppConfiguration
    public class MyServiceTest {

        @Autowired
        MyService myService;


        @Autowired
        Utility utility; 




        @Test
        public void testShowResult() throws Exception {

            assertEquals("Test",myService.showResult());

        }

        @Configuration
        static class MykServiceTestContextConfiguration {

            @Bean
            public MyService myService() {
                return new MyService();
            }           

            @Bean
            public Utility utility() {
                return Mockito.mock(Utility.class);
            }
        }

    }

【问题讨论】:

  • MyService 和 Utility 类中缺少 @Component

标签: java spring unit-testing junit mockito


【解决方案1】:

您必须首先模拟 Utility 类,然后必须在使用 MockitoAnnotations.initMocks(this) 调用您的 @Test 之前调用它,如下所示:

MyServiceTest.java

import static org.mockito.Mockito.when;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.AnnotationConfigWebContextLoader;
import org.springframework.test.context.web.WebAppConfiguration;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class)
@WebAppConfiguration
public class MyServiceTest {

    @InjectMocks
    private MyService myService;

    @Mock
    private Utility utility;

    @Before
    public void setupMock() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testShowResult() throws Exception {
        when(utility.getName()).thenReturn("Test");
        Assert.assertEquals("Test", myService.showResult());
    }

    @Configuration
    static class MykServiceTestContextConfiguration {

        @Bean
        public MyService myService() {
            return new MyService();
        }

        @Bean
        public Utility utility() {
            return new Utility();
        }
    }

}

MyService.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @Autowired
    private Utility utility;

    public String showResult() {
        String result = utility.getName();
        return result;
    }
}

Utility.java

import org.springframework.stereotype.Component;

@Component
public class Utility {
    public String getName() {
        return "hello";
    }

}

【讨论】:

  • 我添加了@Mock Utility 实用程序;` @InjectMocks` private MyService myService;我删除了静态内部类,然后它对我有用,感谢 Arpit 的帮助
【解决方案2】:

利用@Spy

当spy被调用时,实际对象的实际方法被调用。

https://www.tutorialspoint.com/mockito/mockito_spying.htm

请看教程

这对我有用

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
public class MyServiceTest {

    @Spy
    MyService myService;  


    @Test
    public void testShowResult() throws Exception {

        assertEquals("Test",myService.showResult());

    }    

    @Service
    public class MyService{


        public String showResult(){  
            return "Test";
        }
    }

}

仍有问题分享您正在使用的 spring 版本

【讨论】:

    【解决方案3】:

    使用@MockBean怎么样?它适合 Spring + JUnit,并且可能您需要实现模拟行为。

    我猜Utility.getName() 在测试用例中返回“Test”。

    以下是我试过的测试代码。

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(loader = AnnotationConfigWebContextLoader.class)
    @WebAppConfiguration
    public class MyServiceTest {
    
        @Autowired
        MyService myService;
    
        @MockBean
        Utility utility;
    
        @Test
        public void testShowResult() throws Exception {
            Mockito.when(utility.getName()).thenReturn("Test");
    
            assertEquals("Test", myService.showResult());
        }
    
        @Configuration
        static class MykServiceTestContextConfiguration {
    
            @Bean
            public MyService myService() {
                return new MyService();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多