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

时间:2019-05-28 10:47:28

标签: java java-ee junit mockito

我知道,任何不做任何事情的方法都不应进行测试(甚至不存在)。事实是,我的方法可以正常执行某些操作,但是对于测试场景,我必须模拟它可以执行的操作。但是我仍然想声明将发送给外部事物的参数。

听起来比现在复杂得多-检查我的代码段以获得更好的理解:

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 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

一种方法是使用可变对象参数化方法<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.herpag.aufraeumen</string> <key>ProgramArguments</key> <array> <string>/Users/hansthiele/Applications/Aufraeumen.app/Contents/MacOS/Application Stub</string> </array> <key>StartCalendarInterval</key> <dict> <key>Minute</key> <integer>45</integer> <key>Hour</key> <integer>13</integer> </dict> </dict> </plist> ,您可以在执行方法时进行设置并在测试方法中进行断言。否则,您还可以检查是否有任何负面情况引发的异常,例如

doSomething