Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我想忽略其他参数时,如何验证我是否使用正确的参数调用服务?_Java_Unit Testing_Mocking_Mockito - Fatal编程技术网

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));