77

クラスごとにテストクラスを持ち、メソッドごとに内部クラスを持つユニットテストの構造化について読みました。これはテストを整理するのに便利な方法のように思えたので、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 はこれをサポートしていませんか、それとも間違っていますか?

4

5 に答える 5

97

クラスに で注釈を付け@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() { }
  }
}
于 2013-03-01T13:10:37.130 に答える
32
public class ServicesTest extends TestBase {

   public static class TestLogon{

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

内部クラスを静的にすることは私にとってはうまくいきます。

于 2012-01-06T13:27:47.270 に答える
15

答えのいくつかは、古いバージョンの 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() { }
        }
    }
于 2014-03-20T22:25:36.160 に答える
10

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: サンプル コードは、上記のブログ投稿から取得して変更したものです。

于 2015-10-27T13:24:51.530 に答える