Java
JUnit
compile-testing
AbstractProcessor

com.google.testing.compile を使ったテスト

More than 1 year has passed since last update.

アノテーションプロセッサーを使用したクラスのテストをjunitを利用して行いたいと思い最初はAptina Unitを使っていましたが、大人の事情により、compile-testingを使用しないといけなくなりましたので、使い方を忘れないようにここに書いております。

compile-testingのgithub
https://github.com/google/compile-testing

(´-`).。oO(英語を見てひるむ。)

他に参考にしたページはこちら
http://blog.64p.org/entry/2015/03/26/055347

http://hisaichi5518.hatenablog.jp/entry/2017/09/21/213423

http://blog.duck8823.com/entry/2016/05/07/095947

(´-`).。oO(安心の日本語)

使い方

pom.xmlには、こう書きます。

<dependency>
  <groupId>com.google.testing.compile</groupId>
  <artifactId>compile-testing</artifactId>
  <version>0.12</version>
  <scope>test</scope>
</dependency>

(´-`).。oO(ここでやめたくなる。)

テストコード

プロセッサーが出力したソースを確認するために書いたテストコードのサンプルです。


import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.*;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import javax.tools.JavaFileObject;

import org.junit.Test;

import com.google.common.io.Resources;
import com.google.testing.compile.Compilation;
import com.google.testing.compile.JavaFileObjects;

import static com.google.testing.compile.Compiler.javac;
import static com.google.common.truth.Truth.assert_;
import static com.google.testing.compile.JavaSourceSubjectFactory.javaSource;

public class MyProcessorTest {
    @Test
    public void test_プロセッサーの出力確認(){
        MyProcessor processor = new MyProcessor();

        // assert
        assert_().about(javaSource())
            .that(JavaFileObjects.forResource(Resources.getResource("HelloWorld.java")))
            .processedWith(processor)
            .compilesWithoutError()
            .and()
            .generatesSources(JavaFileObjects.forSourceString("foo.bar.baz.Blah", "package foo.bar.baz;\n"
                    + "\n"
                    + "import java.lang.String;\n"
                    + "import javax.annotation.Generated;\n"
                    + "\n"
                    + "@Generated({\"me.geso.sample.hello.MyProcessor\"})\n"
                    + "public class Blah {\n"
                    + "  public String hello() {\n"
                    + "    return \"hello\";\n"
                    + "  }\n"
                    + "}"));


    }
}

generatesSources()でfoo.bar.baz.Blahが次のパラーメーターと一致していることを確認できる。

エラーを確認したい時のテスト

    @Test
    public void test_process_エラー() throws Exception {
        File stub = new File(System.getProperty("user.dir") + "/src/test/java/jp/co/processor/MyProErrStub.java");

        assert_().about(JavaSourceSubjectFactory.javaSource())
            .that(JavaFileObjects.forResource(stub.toURI().toURL()))
            .processedWith(new MyProcessor())
            .failsToCompile();
    }
  • failsToCompile()で、エラーとなることの確認ができる。