方法不会被嘲笑

我正在使用 Mockito 来模拟一个方法,但测试正在运行真正的方法。


//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);


    }

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


//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 方法签名是:


public String writeToKafka(String topic, String json, KafkaTemplate<String, String> kafkaTemplate, String classname)

但是,当我运行测试时,并没有嘲笑 writeTokafka!它运行实际的方法。为什么会这样?我错过了什么?


沧海一幻觉
浏览 142回答 1
1回答

守着星空守着你

您的问题的症结在于:您正在使用new一个实例,Utils并且无法从测试中清楚地得到它。有两种方法可以解决这个问题 - 两者都来自关于是否要使用模拟的哲学立场。两者都要求您Utils在某处注入并使其成为 bean。注入Utils并在您的测试中注入模拟,并放弃Spring 测试运行器。一旦你有了模拟,你会想要改变你的测试,不使用 Spring runner,而是使用 Mockito runner。@RunWith(MockitoJUnitRunner.class)public class ControllerTest {&nbsp; &nbsp; @Mock&nbsp; &nbsp; private Utils utils;&nbsp; &nbsp; @InjectMocks&nbsp; &nbsp; private Controller testObj;&nbsp; &nbsp; // The rest of your test code}Utils作为已定义的测试范围 bean注入到您的测试中,该 bean 展示了您在测试中想要的行为。这有点繁琐,但您可以利用 Spring 测试运行器。我将此作为练习留给读者(基本上,一旦您Utils编写了bean,再编写一个用于测试的bean 并不困难)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java