我知道,任何不做任何事情的方法都不应进行测试(甚至不存在)。事实是,我的方法可以正常执行某些操作,但是对于测试场景,我必须模拟它可以执行的操作。但是我仍然想声明将发送给外部事物的参数。
听起来比现在复杂得多-检查我的代码段以获得更好的理解:
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
的值?如果不是这样,那么不弄乱我的课程只是为了测试,什么是最好的解决方案?
答案 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