はじめに
Java 14がついにリリースされたので、
以前書いたJavaでTable Driven Testを実装するで紹介したソースコードを、
Java 14でPreviewとして追加されたRecordsを使って書き直してみました。
Java 14以前のTable Driven Test
以前のソースコードでは、
テストケースをTestCaseという内部クラスで保持していました。
コンストラクタやgetterはLombokを使って定義していました。
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.experimental.Accessors;
import org.junit.jupiter.api.*;
import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.assertEquals;
class MathTest {
@Nested
static class Pow {
@AllArgsConstructor
@Getter
@Accessors(fluent = true)
static class TestCase {
private String name;
private double x;
private double y;
private double expected;
}
@TestFactory
Stream<DynamicNode> testPow() {
return Stream.of(
new TestCase("pow(2,1)", 2, 1, 2),
new TestCase("pow(2,2)", 2, 2, 4),
new TestCase("pow(2,3)", 2, 3, 8),
new TestCase("pow(2,0)", 2, 0, 1),
new TestCase("pow(2,-1)", 2, -1, 0.5),
new TestCase("pow(2,+Inf)", 2, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY),
new TestCase("pow(2,-Inf)", 2, Double.NEGATIVE_INFINITY, 0),
new TestCase("pow(+Inf,2)", Double.POSITIVE_INFINITY, 2, Double.POSITIVE_INFINITY),
new TestCase("pow(-Inf,2)", Double.NEGATIVE_INFINITY, 2, Double.POSITIVE_INFINITY)
).map(testCase -> DynamicTest.dynamicTest(
testCase.name(),
() -> {
double result = Math.pow(testCase.x(), testCase.y());
assertEquals(testCase.expected(), result);
})
);
}
}
}
Java 14のTable Driven Test
今回のソースコードでは、
テストケースをrecordで保持するようにしました。
recordを使うことで、Lombokを使った場合よりもコード量を減らすことができました。
import org.junit.jupiter.api.DynamicNode;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.TestFactory;
import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class MathTest {
@Nested
static class Pow {
record TestCase(String name, double x, double y, double expected) {
}
@TestFactory
Stream<DynamicNode> testPow() {
return Stream.of(
new TestCase("pow(2,1)", 2, 1, 2),
new TestCase("pow(2,2)", 2, 2, 4),
new TestCase("pow(2,3)", 2, 3, 8),
new TestCase("pow(2,0)", 2, 0, 1),
new TestCase("pow(2,-1)", 2, -1, 0.5),
new TestCase("pow(2,+Inf)", 2, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY),
new TestCase("pow(2,-Inf)", 2, Double.NEGATIVE_INFINITY, 0),
new TestCase("pow(+Inf,2)", Double.POSITIVE_INFINITY, 2, Double.POSITIVE_INFINITY),
new TestCase("pow(-Inf,2)", Double.NEGATIVE_INFINITY, 2, Double.POSITIVE_INFINITY)
).map(testCase -> DynamicTest.dynamicTest(
testCase.name(),
() -> {
double result = Math.pow(testCase.x(), testCase.y());
assertEquals(testCase.expected(), result);
})
);
}
}
}
まとめ
これからも新機能を使ってソースコードを改善していけると良いです。