Java 当我想忽略其他参数时,如何验证我是否使用正确的参数调用服务?
我有Java 当我想忽略其他参数时,如何验证我是否使用正确的参数调用服务?,java,unit-testing,mocking,mockito,Java,Unit Testing,Mocking,Mockito,我有SomeService类,它有方法验证(公司,地点)位置是枚举-位置。欧洲和位置。美国。根据位置,我选择了不同的电子邮件模板,即我在SomeService中有私有方法: private String chooseServiceResource(Location location){ if(location.equals(Location.EUROPE)) return "resourceEU"; return "resourceUSA"; } 在someS
SomeService
类,它有方法验证(公司,地点)
<代码>位置是枚举-位置。欧洲
和位置。美国
。根据位置,我选择了不同的电子邮件模板,即我在SomeService
中有私有方法:
private String chooseServiceResource(Location location){
if(location.equals(Location.EUROPE))
return "resourceEU";
return "resourceUSA";
}
在someService(公司、位置)
中,我调用选择服务源(位置)
并选择正确的模板字符串
public void someService(Company company, Location location) {
String name = company.getName();
String info = company.getInfo();
....
String resourcee = chooseResourceTemplate(location);
String body = templateEngine.process(resource, content);
...
//do something else and send the email
}
templateEngine
被注入@Qualifier-private-templateEngine-templateEngine代码>
更新:
在EmailService
中,我有以下方法:
public void setTemplateEngine(TemplateEngine templateEngine) {
this.templateEngine = templateEngine;
}
我用以下方法注射它:
@Autowired
@Qualifier("textTemplateEngine")
private TemplateEngine templateEngine;
内部EmailServiceTest
这曾经是我的设置()
是的,我知道templateEngine
不是一个模拟对象,而是一个实际对象,因此第verify(templateEngine).process(“templateEU”,any(Content.class))行出现错误代码>。但当我将其更改为mock时,会得到NullpointerException
更新结束
在我的测试中,我想测试当地点是欧洲时,它将处理templateEU
,当地点是美国时,它将处理templateEU
我尝试了以下方法:
@Test
public void shouldCallTemplateEngineWithEuropeTemplate(){
location = Location.EUROPE;
//throws null pointer exception
emailService.sendEmail(any(Person.class), location);
verify(templateEngine).process("templateEU", any(Content.class));
}
但它抱怨我在嘲笑Person
参数。在这个特定的测试中,我不关心我发送的是哪个Person
对象,我只关心位置
枚举。在安排或断言对模拟依赖项的成员调用时使用参数匹配器
在执行测试中的成员时,它们不作为参数使用/传递,而是实际传递类型的默认值,在本例中为null。因此,当
String name = person.getName();
被称为
相反,创建参数的实例并将其传递给被测对象
//Arrange
location = Location.EUROPE;
Person person = new Person();
//Act
emailService.sendEmail(person, location);
//Assert
//...
或者只是模拟类并传递它,以避免空引用错误
//Arrange
location = Location.EUROPE;
Person person = mock(Person.class);
//Act
emailService.sendEmail(person, location);
//Assert
//...
确保在Person
上设置任何会员呼叫,如果未配置,则会导致问题
至于模板问题,您应该模拟模板,以便单元测试是真正的独立测试
@Before
public void setup() {
templateEngine = mock(TemplateEngine.class); //Use a mock
MockitoAnnotations.initMocks(this);
emailService.setTemplateEngine(templateEngine);
}
及
行为符合预期。不能使用“任何人”调用方法。你需要和一个特定的人打电话。然后,根据特定的人,您可以检查process()是否已使用eq(“templateEU”)和任意()内容调用。安排或断言成员调用时,将使用参数匹配器。当执行被测成员时,它们不会用作参数。消息会准确地告诉问题所在。您只能验证是否在模拟对象(而不是常规对象)上使用预期参数调用了方法。
@Before
public void setup() {
templateEngine = mock(TemplateEngine.class); //Use a mock
MockitoAnnotations.initMocks(this);
emailService.setTemplateEngine(templateEngine);
}
verify(templateEngine).process("templateEU", any(Content.class));