使用JUnit的内部类中的测试用例


70

我读到有关构造单元测试的内容,每个类都有一个测试类,每个方法都有一个内部类。认为这似乎是组织测试的便捷方法,因此我在Java项目中进行了尝试。但是,内部类中的测试似乎根本没有被采用。

我大致是这样做的:

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不支持此功能,还是我做错了?


1
我认为,如果您声明内部类static,它应该可以工作。
斯蒂芬

Answers:


29
public class ServicesTest extends TestBase {

   public static class TestLogon{

       @Test
       public void testLogonRequest() throws Exception {
         //My Test Code
       }
   }
}

使内部类静态化对我有效。


您仍然一次只能运行1节课。
Sridhar Sarnobat

@ Sridhar-Sarnobat你在说什么?它至少在JUnit 4.12中有效。虽然不能打扰测试较旧的版本。
Adowrath'1

另外,如果使用Gradle,./gradlew clean似乎对我
有用

90

您应该使用来注释您的类@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() { }
  }
}

您仍然一次只能运行1节课。
Sridhar Sarnobat

3
为我工作。至少在Intellij中,我可以运行所有测试,只能运行一个子类的测试,也可以运行一个测试。通过代码折叠,这真的很棒!
威利

使用Eclipse Neon和JUnit 4.12为我运行所有测试。Eclipse还提示运行外部固定装置或嵌套固定装置之一。我唯一的问题是,从Gradle运行时,嵌套夹具的测试运行两次。 GRADLE-2843于2013年针对此问题开放,但此后被放弃。
Rusty Shackleford

还请注意内部类必须是公共的。
tkruse19年

这似乎已经过时了-请参阅stackoverflow.com/a/22546453/5209935
马修(Matthew),

16

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

14

我认为某些答案可能适用于旧版本的JUnit。在JUnit 4中,这对我有用:

    @RunWith(Suite.class)
    @Suite.SuiteClasses({ DogTests.BarkTests.class, DogTests.EatTests.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() { }
        }
    }

5
它对我没有extends Suite关联的构造函数有效。
尼古拉斯2014年

2
相反extends Suite,您可以做到@RunWith(Suite.class)。这就是在文档中的用法
mjohnsonengr

我已经使用相关的JUnit4语法更新了该示例,希望可以。
马修

9

我在Nitor Creation的Nested Runner上也取得了成功。

如何使用Nitor Creation的Nested Runner

这里有一篇说明文章

添加此依赖项:

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

@RunWith测试一下:

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:示例代码已从上述博客文章中获取并进行了修改


3
我一直在寻找一种使类似规范的东西出现在JUnit中的方法……完美!谢谢!
Tony K.

3
正是我想要的!
杰夫·斯拉文

这也适用于Kotlin(@RunWith(NestedRunner::class在这种情况下使用)。
x1a4 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.