为了账号安全,请及时绑定邮箱和手机立即绑定

方法不会被嘲笑

方法不会被嘲笑

沧海一幻觉 2021-09-26 16:56:34
我正在使用 Mockito 来模拟一个方法,但测试正在运行真正的方法。//Controller@RestControllerpublic 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!它运行实际的方法。为什么会这样?我错过了什么?
查看完整描述

1 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

您的问题的症结在于:您正在使用new一个实例,Utils并且无法从测试中清楚地得到它。


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


注入Utils并在您的测试中注入模拟,并放弃Spring 测试运行器。


一旦你有了模拟,你会想要改变你的测试,不使用 Spring runner,而是使用 Mockito runner。


@RunWith(MockitoJUnitRunner.class)

public class ControllerTest {

    @Mock

    private Utils utils;


    @InjectMocks

    private Controller testObj;


    // The rest of your test code

}

Utils作为已定义的测试范围 bean注入到您的测试中,该 bean 展示了您在测试中想要的行为。


这有点繁琐,但您可以利用 Spring 测试运行器。我将此作为练习留给读者(基本上,一旦您Utils编写了bean,再编写一个用于测试的bean 并不困难)。


查看完整回答
反对 回复 2021-09-26
  • 1 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信