【问题标题】:JUnit - Share Tests Of Different Implementations [closed]JUnit - 共享不同实现的测试 [关闭]
【发布时间】:2018-09-18 16:00:04
【问题描述】:

我正在寻找一种最易读的方式来共享接口的不同实现的测试。

关于这个主题的最流行但相当古老的问题是 - Writing a single unit test for multiple implementations of an interface.

对于上述问题,给出了 2 个主要和不同的答案 -

  1. 参数化测试。
  2. 测试继承。

我对这两个答案都不满意。

  1. 参数化测试 - 答案不包括如何参数化每个子类的代码示例。此外,我个人很难进行参数化测试,而且我发现 API 一点也不直观。

  2. 我总是担心过度使用继承,而且我不确定测试继承是否是一种好习惯。

我想知道 2018 年这个问题的最佳答案是什么。

【问题讨论】:

    标签: java unit-testing junit junit4 junit5


    【解决方案1】:

    对测试进行参数化似乎仍然是此类用例的教科书解决方案。不过,JUnit Jupiter's syntax 确实让它更优雅一点。 API 非常清晰,恕我直言(测试有参数,注释显示它们来自哪里):

    public class ListTest {
    
        public static Stream<List<String>> lists() {
            return Stream.of(new ArrayList<>(), new LinkedList<>());
        }
    
        @ParameterizedTest
        @MethodSource("lists")
        public void testAdd(List<String> list) {
            list.add("xyz");
            assertEquals(1, list.size());
            assertFalse(list.isEmpty());
            assertEquals("xyz", list.get(0));
        }
    }
    

    【讨论】:

      【解决方案2】:

      可能不是最类似于 Java 的,但您可以遵循表驱动的测试格式。使用本地类,以保持测试的可读性,并使上下文尽可能接近真实测试。

      注意:这与@RunWith(Parameterized.class) 的底层高级方法非常相似

      // Assuming Animal interface has a `public boolean canDance()`
      
      @Test
      public void TestAnimalCanDance() {
          class Tester {
              String errMsgFmt = "%s failed the test";
              boolean expected;
              Animal animal;
              public Tester(boolean expected, Animal animal) {
                  this.expected = expected;
                  this.animal = animal;
              }
          }
      
          Tester dog = new Tester(true, new Dog());
          Tester cat = new Tester(false, new Cat());
          Tester monkey = new Tester(false, new Monkey());
          Tester[] tests = Arrays.asList(dog, cat, monkey);
      
          for (Tester t: tests) {
              boolean actual = t.canDance();
              assertTrue(actual == t.expected);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多