【问题标题】:Test cases in inner classes with JUnit使用 JUnit 的内部类中的测试用例
【发布时间】:2012-02-04 05:01:47
【问题描述】:

我读到了Structuring Unit Tests,每个类都有一个测试类,每个方法有一个内部类。认为这似乎是一种组织测试的便捷方式,所以我在我们的 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 不支持这个,还是我做错了?

【问题讨论】:

标签: java junit4 inner-classes testcase


【解决方案1】:
public class ServicesTest extends TestBase {

   public static class TestLogon{

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

使内部类静态对我有用。

【讨论】:

  • 您仍然只能一次运行 1 节课。
  • @Sridhar-Sarnobat 你在说什么?它至少在 JUnit 4.12 中有效。不过也懒得去测试旧版本了。
  • 另外,如果使用 Gradle,./gradlew clean 似乎对我有用(我认为)
【解决方案2】:

您应该使用@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 个课程。
  • 为我工作。至少在 Intellij 中,我既可以运行所有测试,也可以只运行一个子类的测试,也可以运行单个测试。有了代码折叠,这真是太好了!
  • 使用 Eclipse Neon 和 JUnit 4.12 为我运行所有测试。 Eclipse 还提示运行外部夹具或嵌套夹具之一。我唯一的问题是,当从 Gradle 运行时,来自嵌套夹具的测试会运行两次。 GRADLE-2843 于 2013 年针对此问题开放,但此后已被废弃。
  • 还要注意内部类必须是公共的。
  • 这似乎已经过时 - 请参阅 stackoverflow.com/a/22546453/5209935
【解决方案3】:

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

【讨论】:

  • 它适用于我没有extends Suite 和相关的构造函数。
  • 你可以改成extends Suite,而不是@RunWith(Suite.class)。这是它在文档中的使用方式:junit.sourceforge.net/javadoc/org/junit/runners/Suite.html
  • 我已经用最新的 JUnit4 语法更新了这个例子,希望没问题。
【解决方案4】:

Nitor Creation's Nested Runner 也取得了成功。

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

有一个post explaining it here:

添加这个依赖:

<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:示例代码取自上述博文并进行了修改

【讨论】:

  • 我正在寻找一种方法来让 JUnit 中出现类似规范的东西......完美!谢谢!
  • 正是我想要的!
  • 这也适用于 Kotlin(在这种情况下使用 @RunWith(NestedRunner::class)。
【解决方案5】:

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

【讨论】:

    猜你喜欢
    • 2022-10-12
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 2013-04-08
    相关资源
    最近更新 更多