Mockito java.lang.Exception:当我在测试中使用内部类时,类应该是公共的

时间:2015-02-12 10:26:50

标签: java unit-testing mockito inner-classes

我有以下测试:

@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.请告诉我优雅的方法,以避免跟随错误。

我想将逻辑封装在一个文件中。

2 个答案:

答案 0 :(得分:0)

最近我遇到了同样的问题,我通过将班级更改为公共班级来解决了这个问题。您可能需要检查您的Class Base1是否确实是公共课程。

答案 1 :(得分:-1)

  1. 问题的原因是您的测试类模板过度设计。
  2. 我知道避免错误的最优雅的方法是重构你的测试类(我省略了@RunWith注释,因为我不知道正确的是什么):

    public class ProductTest {
        @Before
        public void setUpBase()  {...}
    
        @Test
        public void foo(){...}
    
        @Test
        public void bar(){...}
    }
    
  3. 在您的实现中,将每个测试都放在其自己的类中是不必要的,因为JUnit无论如何都会创建多个ProductTest实例 - 因此每个测试都与所有其他测试隔离而不必在其自身中类。