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.请告诉我如何避免以下错误 我想将逻辑封装在一个文件中
在您的实现中,将每个测试放在自己的类中是不必要的,因为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(){...}
}