使用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() { } } }