【问题标题】:Mockito rest template is always null for mocked object对于模拟对象,Mockito 休息模板始终为空
【发布时间】:2020-05-21 12:06:17
【问题描述】:

当模拟一个包含休息模板的类时,休息模板总是空的,我的代码是:

public class ClassA {

    private final RestTemplate restTemplate;

    public ClassA(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    public byte[] method(String url) {
       // do some restTemplate.getForObject()
    }
}

   @RunWith(SpringRunner.class)
   @SpringBootTest(classes = {Application.class})
public class TestClass {

    @Mock
    private ClassA classa

     public void test1() {

      Mockito.doReturn(byeArray).when(classA).method("url");
     }
}

检查行时 Mockito.doReturn(byeArray).when(classA).method("url");我注意到对象 classA 包含其余模板,但它是空的。

【问题讨论】:

    标签: java spring junit mocking mockito


    【解决方案1】:

    模拟是在依赖项上完成的,而不是在被测类上。还有一些方法可以模拟被测类的方法,可以使用Spy 来完成。

    在你目前的情况下,应该是这样的。

    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = {Application.class})
    public class TestClass {
    
        @InjectMock
        private ClassA classa
    
        @Mock
        private RestTemplate restTemplate
    
        @Test
        public void test1() {
          Mockito.doReturn(byeArray).when(restTemplate).method(url);
       }
    }
    

    被测类ClassA 应使用@InjectMocks 注释,依赖项应使用@Mock 模拟。

    另外需要注意的是,在您的测试用例中,您应该调用需要测试的ClassA 方法。

    @Test
    public void test1() {
      Mockito.doReturn(byeArray).when(restTemplate).doSomething(url);
    
      classa.method(url);
    }
    

    【讨论】:

    • 明白你在说什么,还有一个问题,Mockito.doReturn(byeArray).when(restTemplate).doSomething(url);这不会起作用,因为 doSomething() 是 classA 的方法,而不是 restemplate 的方法
    • @SEED 如果你想控制classA 本身的方法,你应该探索名为Spying 的概念。虽然这不是一个好习惯。如果您的 doSomething 方法是私有的,我仍然建议您不要嘲笑它。应该对外部依赖项进行模拟。我希望这会有所帮助。
    • 如果你的其他方法doSomething(),调用RestTemplate,尝试模拟RestTemplate调用。
    猜你喜欢
    • 2013-03-07
    • 1970-01-01
    • 2016-03-31
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 2017-08-21
    相关资源
    最近更新 更多