mike、mikeなるままに…

プログラムに関してぬるま湯のような記事を書きます

gradleとJUnitのEnclosedの話

みけです。

先ほど書いたエントリーでテストをgradleで走らせたのですが、

という状態が発生してました。

具体的には、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package org.mikeneck.multithreads;

import org.junit.*;
import org.junit.experimental.runners.Enclosed;
import org.junit.rules.TestName;
import org.junit.runner.RunWith;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.*;

import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;

/**
 * @author mike
 */
@RunWith(Enclosed.class)
public class SimpleSocketTest {

    public static class SingleClient {

        private static final ExecutorService SERVICE = Executors.newFixedThreadPool(1);

        private static final int PORT = 12521;

        private static final String LOCALHOST = "localhost";

        private SimpleClient client;

        @Rule
        public TestName testName = new TestName();

        @BeforeClass
        public static void start () throws IOException {
            SERVICE.execute(new SimpleServer(PORT));
        }

        @Before
        public void setup () throws IOException {
            client = new SimpleClient(LOCALHOST, PORT);
        }

        @After
        public void tearDown () throws Exception {
            System.out.println(testName.getMethodName() + " is closing");
            client.close();
        }

        @AfterClass
        public static void end () throws IOException {
            new SimpleClient(LOCALHOST, PORT).open().bye();
        }

        @Test
        public void socketProcessing () throws IOException {
            client.open();
            String message = client.sendMessage("Hello");
            System.out.println("Message from Server [" + message + "]");
            assertThat(message, is("Hello"));
            System.out.println("Assertion ends.");
        }
    }
}

というテストに対して、

という感じで、謎のclassMethodというテストが追加されていて、

実行されてテストが落ちてしまうようです。

先駆者はいた

とりあえず、gradleEnclosedJunitでググっていたところ、

次の二つのエントリーを発見しました。

というわけで、gradleEnclosedの相性がわるいっぽい…

gradleでEnclosedなテストをする時の対策

というわけで、@shuji_w6eさんのページによると

テストの実行時に除外クラスを指定すること。

だそうです。

build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
apply plugin : 'groovy'
apply plugin : 'idea'

group = 'org.mikeneck.multithreads'
version = '1.0'

def compatibility = 1.7

sourceCompatibility = compatibility
targetCompatibility = compatibility

repositories {
  mavenCentral ()
}

dependencies {
  compile 'org.codehaus.groovy:groovy-all:2.1.3'
  testCompile ('junit:junit:4.11') {
      exclude module : 'hamcrest-core'
      exclude module : 'hamcrest'
  }
  testCompile 'org.hamcrest:hamcrest-library:1.+'
}

test {
    exclude '**/*$*'
}

とりあえず、テストクラスを除外してみました。

結果

という感じで、テストが通りました。