如何使用Junit创建可共享的测试包?

时间:2019-10-28 19:21:54

标签: java maven junit

假设我已经在maven中创建了一个模块化项目,该项目在api中定义了myproject-api接口,并且在myproject-impl和{{ 1}}。

myproject-impl2

我想创建一个单一的测试套件,可以针对这两种实现进行测试。当然,将来,我可以添加另一个实现,我也想使用该通用测试工具包对其进行测试。

用junit实现这种共享测试的最佳实践是什么?

接口示例(在myproject-api myproject-impl myproject-impl2 中):

myproject-api

实施:

  • 在模块public interface SmallLettersSource { String read(); } 中:
myproject-impl
  • 在模块class ASource implements SmallLettersSource { @Override public String read() { return "a"; } } 中:
myproject-impl2

进行测试(我也想将其添加到class BSource implements SmallLettersSource { @Override public String read() { return "b"; } } 中):

myproject-api

1 个答案:

答案 0 :(得分:3)

我想出了以下解决方案:

    myproject-api中,
  1. 创建了类CommonTestSuite,该类返回了DynamicTest对象的列表:

    public class CommonTestSuite {
    
        private final Source source;
    
        public CommonTestSuite(Source source) {
             this.source = source;
        }
    
        public Collection<DynamicTest> tests() {
    
            return Arrays.asList(
                dynamicTest("Should return only lowercase.", this::testLowercase),
                dynamicTest("Should return only one letter.", this::testLength)
            );
    
        }
    
        void testLowercase() {
             assert(source.read().equals(source.read().toLowerCase()));
        }
    
        void testLength() {
             assert(source.read().size() == 1);
        }
    }
    
    
    1. 然后在实现模块的测试中,我只需要这样做:
    class MyProjectImplTest {
    
        @TestFactory
        Collection<DynamicTest> test() {
           return new CommonTestSuite(new ASource()).tests();
        }
    }
    

    ,对于其他模块,我需要进行类似的设置。这样,我可以在各个模块之间共享通用测试。