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

在测试场景中测试不改变任何内容的无效方法

在测试场景中测试不改变任何内容的无效方法

慕仙森 2022-12-21 12:45:56
我知道每个不做任何事情的方法都不应该被测试(或者甚至不存在)。问题是,我的方法通常会做一些事情,但对于测试场景,我必须模拟它所做的事情。但我仍然想断言它将发送给外部事物的参数。听起来比实际更复杂——检查我的代码片段以便更好地理解:class A {    @Inject    private Mailer mailer; // Custom mailer class    public void doSomething() {        Date date = new Date(); // dynamic parameter I do not care about in the test        String parameter = "test"; // The parameter I want to test later        mailer.sendMail(parameter, date);    }}class ATest {    @Mock    @Produces    private Mailer mailer;    @Inject    private A classToTest;    @Test    public void testDoSomething() throws Exception {        classToTest.doSomething();        assertThat(??).isEqualTo("test"); //How can I get the value of parameter?    }}如您所见,我需要模拟我的电子邮件程序,这样我就不会在每次测试运行时都发送电子邮件。parameter提升为全局变量是没有意义的。有什么方法可以在parameter不更改代码的情况下测试值A吗?如果不是,最好的解决方案是什么,而不会为了测试而弄乱我的课程?
查看完整描述

2 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

您需要使用Mockito.verify

verify(mailer, times(1)).sendMail("test");

Verify 检查你的模拟发生了什么:一个方法被调用了多少次,以及为该方法提供了哪些参数。


更新:如果你想排除某些参数,你可以使用org.mockito.Matchers.any- 更容易将其作为静态导入。(注意:如果您确实忽略了一些参数,那么您现在想要包含的参数必须包含在 中org.mockito.Matchers.eq)。

verify(mailer, times(1)).sendMail(eq("test"), any(Date.class));


查看完整回答
反对 回复 2022-12-21
?
慕标5832272

TA贡献1966条经验 获得超4个赞

一种方法是doSomething使用可变对象对方法进行参数化,您可以在方法执行时设置该对象并在测试方法中断言。否则,您还可以检查是否为任何负面情况抛出异常,例如


@Test(expected = EmailSendException.class)

public void testDoSomething(){

    ....

}


查看完整回答
反对 回复 2022-12-21
  • 2 回答
  • 0 关注
  • 124 浏览

添加回答

举报

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