Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mockito java.lang.Exception:当我在测试中使用内部类时,类应该是公共的_Java_Unit Testing_Mockito_Inner Classes - Fatal编程技术网

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

Mockito java.lang.Exception:当我在测试中使用内部类时,类应该是公共的,java,unit-testing,mockito,inner-classes,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 exten

我有以下测试:

@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)
java.lang.Exception:类Base1应该是公共的
位于org.junit.runners.model.FrameworkMethod.validatePublicVoid(FrameworkMethod.java:91)
位于org.junit.runners.model.FrameworkMethod.validatePublicVoidNoArg(FrameworkMethod.java:70)
位于org.junit.runners.ParentRunner.validatePublicVoidNoArgMethods(ParentRunner.java:133)
位于org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:165)
位于org.junit.runners.BlockJUnit4ClassRunner.collectionInitializationErrors(BlockJUnit4ClassRunner.java:104)
位于org.junit.runners.ParentRunner.validate(ParentRunner.java:355)
在org.junit.runners.ParentRunner上(ParentRunner.java:76)
位于org.junit.runners.BlockJUnit4ClassRunner。(BlockJUnit4ClassRunner.java:57)
位于org.mockito.internal.runners.junit45和higherrunnerimpl$1。(junit45和higherrunnerimpl.java:23)
1.请向我说明问题的原因
2.请告诉我如何避免以下错误

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

  • 问题的原因是您的测试类模板设计过度
  • 我所知道的避免错误的最优雅的方法是像这样重构您的测试类(我省略了@RunWith annotation,因为我不知道正确的方法是什么):


  • 在您的实现中,将每个测试放在自己的类中是不必要的,因为JUnit无论如何都会创建ProductTest的多个实例-因此每个测试都与所有其他测试隔离,而不必放在自己的类中。

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

    运行JUnit 4.12/java 8,这两个代码段的错误都是不可重现的。你的问题不是很清楚,应该是什么。总之,只要看一下错误消息,就很容易理解类
    Base1
    的公共可见性是问题所在,并且该类在您的第二个代码段中具有包可见性。1。我使用Java6.2。同一文件不能包含2个公共类您是否尝试过用
    @Ignore
    标记
    Base1
    ?这会导致具体类被忽略吗?这感觉像是一个错误。为了帮助排除这种情况,也许您可以通过使用所有这些内部测试类来解释您试图解决的问题。Junit要求测试类必须是公共的。正如@gstackoverflow提到的,一个java文件不能有两个公共类。但您可以尝试在ProductTest类内将Base1设置为公共静态类(将其移动到其主体中),这应该是可行的。
    public class ProductTest {
        @Before
        public void setUpBase()  {...}
    
        @Test
        public void foo(){...}
    
        @Test
        public void bar(){...}
    }