使用JUnittesting内部类的情况

我读了关于构造unit testing ,每个类有一个testing类,每个方法有一个内部类。 看起来像组织testing的一个方便的方法,所以我在我们的Java项目中尝试过。 然而,在内部类的testing似乎没有被拿起。

我大致是这样做的:

public class DogTests { public class BarkTests { @Test public void quietBark_IsAtLeastAudible() { } @Test public void loudBark_ScaresAveragePerson() { } } public class EatTests { @Test public void normalFood_IsEaten() { } @Test public void badFood_ThrowsFit() { } } } 

JUnit不支持这个,还是我只是做错了?

 public class ServicesTest extends TestBase { public static class TestLogon{ @Test public void testLogonRequest() throws Exception { //My Test Code } } } 

使内部类静态为我工作。

你应该使用@RunWith(Enclosed.class)来为你的类@RunWith(Enclosed.class) ,就像其他人说的那样,把内部类声明为静态的:

 @RunWith(Enclosed.class) public class DogTests { public static class BarkTests { @Test public void quietBark_IsAtLeastAudible() { } @Test public void loudBark_ScaresAveragePerson() { } } public static class EatTests { @Test public void normalFood_IsEaten() { } @Test public void badFood_ThrowsFit() { } } } 

我认为一些答案可能是旧版本的JUnit。 在JUnit 4中,这为我工作:

 @RunWith(DogTests.class) @SuiteClasses({ DogTests.BarkTests.class, DogTests.EatTests.class }) public class DogTests extends Suite { public DogTests(Class<?> klass, RunnerBuilder builder) throws InitializationError { super(klass, builder); } public static class BarkTests { @Test public void quietBark_IsAtLeastAudible() { } @Test public void loudBark_ScaresAveragePerson() { } } public static class EatTests { @Test public void normalFood_IsEaten() { } @Test public void badFood_ThrowsFit() { } } } 

我也成功地使用了Nitor Creation的Nested Runner 。

如何使用Nitor Creation的嵌套亚军

有一个post在这里解释 :

添加这个依赖:

 <dependency> <groupId>com.nitorcreations</groupId> <artifactId>junit-runners</artifactId> <version>1.2</version> <scope>test</scope> </dependency> 

@RunWith你的testing:

 import com.nitorcreations.junit.runners.NestedRunner import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.*; @RunWith(NestedRunner.class) public class RepositoryUserServiceTest { public class RegisterNewUserAccount { public class WhenUserUsesSocialSignIn { public class WhenUserAccountIsFoundWithEmailAddress { @Test public void shouldThrowException() { assertTrue(true); } } } } } 

PS:示例代码已经从上面的博客文章中进行了修改

在JUnit 5中,您只需将非静态内部类标记为@Nested

 import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; public class DogTests { @Nested public class BarkTests { @Test public void quietBark_IsAtLeastAudible() { } @Test public void loudBark_ScaresAveragePerson() { } } @Nested public class EatTests { @Test public void normalFood_IsEaten() { } @Test public void badFood_ThrowsFit() { } } } 
Interesting Posts