【问题标题】:Testing multiple classes with 1 test用 1 个测试测试多个类
【发布时间】:2015-06-01 00:58:25
【问题描述】:

假设我有一个包含 2 个类的接口,它们都实现了它。所以我们有接口 I,带有类 A 和 B。对于这两个类,我们需要使用 JUnit4 测试相同的实现函数 doSomething()。有一些依赖,所以我们使用 Mockito。示例测试如下所示:

@Mock private dependantClass d;

@Test
public void test() {
    A.doSomething();
    verify(d).expectedBehavior();
}

我已经为 A(4 个测试)编写了测试套件,没有问题。但是,现在我必须重组测试套件,以便可以在 A 和 B 对象上执行相同的测试类。为此,我应该使用并行的类层次结构。

这让我很困惑。我试过使用 @Parameters 注释,但这给了我输入参数太多的错误。我尝试制作一个 ATest 和 BTest 都扩展自的超级测试类,但我猜我做的不对,因为我得到了空指针异常。

实际上复制所有的测试用例,只是将 A 更改为 B 就通过了所有的测试,也就是说这 2 个类做的都是一样的。我意识到这听起来像是错误的设计,老实说,它可能是。但是,我没有实际更改代码的可能性,我只需要对其进行测试。

我只是做错了吗?我应该如何实现这个?

【问题讨论】:

  • 请展示您如何尝试参数化您的测试。这是正确的方法,您可能错过了一些小事。
  • 我想知道为什么 parameterized-tests 在你的情况下失败了。你能在你的尝试上发布一个 sn-p 吗?
  • 这是@Parameters 的一个相当常见的用例,因此您可能需要显示该尝试的一些细节。 “输入参数过多”可能是一个简单的错误(例如与构造函数的签名不匹配),如果您发布该代码就可以诊断出来。
  • 非常感谢大家,我已经解决了这个错误。正如@sprinter 所建议的那样,它与构造函数的签名不匹配,再加上我的注释中的错误。这种组合让我一无所知。感谢你们 3 个人确认参数方法是正确的,我现在已经搞定了。 :)

标签: java unit-testing testing mocking mockito


【解决方案1】:

您可以尝试 JUnit 理论:

@RunWith(Theories.class)
public class AdditionWithTheoriesTest {
  private dependantClass d;

  @Before
  public void before() {
    d = mock(dependantClass);
  }

  @DataPoints
  public static I[] positiveIntegers() {
    return new I[]{
      new A(d),          //inject d into A, may differ
      new B(d)           //inject d into B, may differ
    };

  }

  @Theory
  public void test(I data) {
    data.doSomething();
    verify(d).expectedBehavior();
  }

@Parameters 也可以这样做(如果配置正确)。然而@Parameters 更适合测试一个具有多个数据的类。 @Theories 用于在不同的参数(例如多个类)上断言相同的行为。

【讨论】:

  • 您的意思可能是data.doSomething() 而您正在从静态上下文访问d,这将不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多