方法没有被嘲笑

时间:2018-09-17 14:36:47

标签: java unit-testing testing mocking mockito

我正在使用Mockito模拟方法,但是测试正在运行实际方法。

close_inactive

我有一个看起来像这样的测试类:

//Controller
@RestController
public class Controller {

    private Utils utils = new Utils();

    public String myMethod(String json){

        // Stuff gets done
        return utils.writeToKafka(topic, json, kafkatemplate, classname);

    }

我的writeToKafka方法签名是:

//Test
@RunWith(SpringJUnit4ClassRunner.class)
public class ControllerTest {

    @Captor
    ArgumentCaptor<String> argumentCaptor;

    @Test
    public void processOSPUpdateRequested_test(){
         Controller controller = new Controller();
         Utils utils = Mockito.spy(new Utils());
         Mockito.doReturn("myResult").when(utils).writeToKafka(anyString(), anyString(), any(), anyString());

         String topic = controller.myMethod(myString);

         //Some assertions

但是,当我运行测试时,不会嘲笑writeTokafka!它运行实际的方法。为什么会这样呢?我想念什么?

1 个答案:

答案 0 :(得分:1)

问题的症结所在:您new正在Utils的一个实例中,您无法从测试中完全得到它。

有两种方法可以解决此问题-都来自于关于是否要使用模拟的哲学立场。这两个 do 都要求您注入Utils并使其成为某个位置的bean。

  1. 注入Utils,然后在测试中注入模拟,并放弃 Spring测试运行器。

    一旦安装好模拟程序,就想将测试更改为使用Spring运行器,而是使用Mockito运行器。

    @RunWith(MockitoJUnitRunner.class)
    public class ControllerTest {
        @Mock
        private Utils utils;
    
        @InjectMocks
        private Controller testObj;
    
        // The rest of your test code
    }
    
  2. Utils作为已定义的测试作用域bean注入到测试中,该bean表现出您想要在测试中表现的行为。

    这有点麻烦,但是您可以利用Spring测试运行器。我将其留给读者作为练习(基本上,一旦您编写了Utils bean,编写另一个用于测试就不难了。)