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

问题描述 投票:4回答:2

我有以下测试:

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

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

java unit-testing mockito inner-classes
2个回答
0
投票

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


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

    public class ProductTest {
        @Before
        public void setUpBase()  {...}
    
        @Test
        public void foo(){...}
    
        @Test
        public void bar(){...}
    }
    

在您的实现中,没有必要在自己的类中包含每个测试,因为JUnit始终会创建ProductTest的多个实例-因此每个测试都与所有其他测试隔离开来,而不必属于自己的类。

© www.soinside.com 2019 - 2024. All rights reserved.