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

Svi*_*ish 62 java inner-classes junit4 testcase

我读到了结构化单元测试,每个类都有一个测试类,每个方法都有一个内部类.想象一下,这似乎是一种组织测试的方便方法,所以我在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() { }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

The*_*dor 85

您应该使用@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() { }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

n3u*_*ino 28

public class ServicesTest extends TestBase {

   public static class TestLogon{

       @Test
       public void testLogonRequest() throws Exception {
         //My Test Code
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

使内部类静态适用于我.

  • 您仍然一次只能运行一堂课。 (2认同)

Kai*_*i G 10

我认为一些答案可能适用于旧版本的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() { }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 没有`extends Suite`和相关的构造函数,它适用于我. (5认同)
  • 您可以将其改为“@RunWith(Suite.class)”,而不是“extends Suite”。这是它在文档中的使用方式:http://junit.sourceforge.net/javadoc/org/junit/runners/Suite.html (2认同)

hee*_*nee 10

在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() { }
    }
}
Run Code Online (Sandbox Code Playgroud)


alv*_*o g 8

我在Nitor Creation的Nested Runner中也取得了成功.

如何使用Nitor Creation的嵌套运行器

有一篇文章在这里解释:

添加此依赖项:

<dependency>
    <groupId>com.nitorcreations</groupId>
    <artifactId>junit-runners</artifactId>
    <version>1.2</version>
    <scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

@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);
                }
            }

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

PS:示例代码已经从上面的博客文章中获取和修改

  • 我正在寻找一种方法来使类似规范的东西出现在JUnit中...完美!谢谢! (3认同)
  • 正是我在寻找的! (3认同)