编程语言
首页 > 编程语言> > java – 将jmockit期望与匹配器和原始类型一起使用

java – 将jmockit期望与匹配器和原始类型一起使用

作者:互联网

我正在使用jmockit进行单元测试(使用TestNG),并且我在使用Expectations类模拟出一个使用匹配器将原始类型(布尔值)作为参数的方法时遇到了麻烦.这是一些说明问题的示例代码.

/******************************************************/
import static org.hamcrest.Matchers.is;

import mockit.Expectations;

import org.testng.annotations.Test;

public class PrimitiveMatcherTest {
  private MyClass obj;

  @Test
  public void testPrimitiveMatcher() {
    new Expectations(true) {
      MyClass c;
      {
        obj = c;
        invokeReturning(c.getFoo(with(is(false))), "bas");
      }
    };

    assert "bas".equals(obj.getFoo(false));

    Expectations.assertSatisfied();
  }

  public static class MyClass {
    public String getFoo(boolean arg) {
      if (arg) {
        return "foo";
      } else {
        return "bar";
      }
    }
  }
}
/******************************************************/

包含对invokeReturning(…)的调用的行会抛出NullPointerException.

如果我将此调用更改为不使用匹配器,如:

invokeReturning(c.getFoo(false), "bas");

它工作得很好.这对我没有好处,因为在我的实际代码中,我实际上是在模拟一个多参数方法,我需要在另一个参数上使用匹配器.在这种情况下,Expectations类要求所有参数都使用匹配器.

我很确定这是一个错误,或者也许不可能将Matchers与原始类型一起使用(这会让我感到难过).有没有人遇到过这个问题,并且知道如何绕过它?

解决方法:

问题是Expectation的使用和Matchers不支持原始类型的组合.

Matchers代码依赖于Generic,它基本上不支持基本类型.通常,匹配器的使用更多地用于匹配值;使用Java 5中的自动装箱/拆箱功能,这通常不是问题.

但是JMockit的Expectation没有使用它来匹配值,它使用它进行某种解析来确定方法调用签名类型..在这种情况下,Matchers将导致布尔类型,而你的方法是原始类型.所以它失败了正确地嘲笑它.

对不起,我不能告诉你这方面的任何解决方法.也许别人可以提供帮助.

标签:java,unit-testing,mocking,jmockit
来源: https://codeday.me/bug/20190701/1345371.html