我有以下测试:
@RunWith(Enclosed.class)
public class ProductTest {
@RunWith(MockitoJUnitRunner.class)
@Ignore
public static abstract class Base1 {
@Before
public void setUpBase() {...}
}
public static class Test1 extends Base1{
@Test
public void foo(){...}
}
}
public static class Test2 extends Base1{
@Test
public void bar(){...}
}
}
}
为了避免@Ignore
我重构了这样的类:
@RunWith(Enclosed.class)
public class ProductTest {
@RunWith(MockitoJUnitRunner.class)
public static class Test1 extends Base1 {
@Test
public void foo() {...}
}
@RunWith(MockitoJUnitRunner.class)
public static class Test2 extends Base1 {
@Test
public void bar() {...}
}
}
abstract class Base1 {
@Before
public void setUpBase() {...}
}
但我看到错误:
java.lang.Exception: Class Base1 should be public
at org.junit.runners.model.FrameworkMethod.validatePublicVoid(FrameworkMethod.java:91)
at org.junit.runners.model.FrameworkMethod.validatePublicVoidNoArg(FrameworkMethod.java:70)
at org.junit.runners.ParentRunner.validatePublicVoidNoArgMethods(ParentRunner.java:133)
at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:165)
at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:104)
at org.junit.runners.ParentRunner.validate(ParentRunner.java:355)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:57)
at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl$1.<init>(JUnit45AndHigherRunnerImpl.java:23)
1.请澄清问题的原因
2.请告诉我优雅的方法,以避免跟随错误。
我想将逻辑封装在一个文件中。
答案 0 :(得分:0)
最近我遇到了同样的问题,我通过将班级更改为公共班级来解决了这个问题。您可能需要检查您的Class Base1
是否确实是公共课程。
答案 1 :(得分:-1)
我知道避免错误的最优雅的方法是重构你的测试类(我省略了@RunWith注释,因为我不知道正确的是什么):
public class ProductTest {
@Before
public void setUpBase() {...}
@Test
public void foo(){...}
@Test
public void bar(){...}
}
在您的实现中,将每个测试都放在其自己的类中是不必要的,因为JUnit无论如何都会创建多个ProductTest实例 - 因此每个测试都与所有其他测试隔离而不必在其自身中类。