0

我首先要说的是,我对 Java 真正不了解的一件事是注解。

我来自 python 背景,所以我倾向于将注释视为可以做任何事情的方法的修饰符(比如 python 上的装饰器)。

现在,我有一个问题,就语法而言,如果可以使用注释来解决它看起来会很好,但我不知道它是否可以完成。

基本上,我有不同版本的 API:v1、v2、v3、v4。我对每个版本都有 JUnit4 测试。

ApiV1Test.java

@Test
public void featureX() {
  Connection conn = new ApiConnection("v1");
  response = conn.request("x", "foo")';
  assertEquals("bar", response);
}

@Test
public void featureY() {
  Connection conn = new ApiConnection("v1");
  response = conn.request("y", "foo_y")';
  assertEquals("bar_y", response);
}

ApiV2Test.java

@Test
public void featureX() {
  Connection conn = new ApiConnection("v2");
  response = conn.request("x", "foo")';
  assertEquals("bar", response);
}

@Test
public void featureZ() {
  Connection conn = new ApiConnection("v2");
  response = conn.request("z", "foo_y")';
  assertEquals("bar_z", response);
}

问题是不同的版本有不同的功能;v1 可能具有特性 X 和 Y,v2 可能具有特性 X 和 Z。依此类推,每个特性都在 API 的某个子集中可用。

因此,这会导致大量代码重复。我只想拥有一个具有所有不同功能的文件,并有一种机制可以说“为这些版本运行此测试”,例如:

@Test
@Versions("v1", "v2")
public void featureX(String version) {
  Connection conn = new ApiConnection(version);
  response = conn.request("x", "foo")';
  assertEquals("bar", response);
}

@Test
@Versions("v1")
public void featureY(String version) {
  Connection conn = new ApiConnection(version);
  response = conn.request("y", "foo_y")';
  assertEquals("bar_y", response);
}


@Test
@Versions("v2")
public void featureZ(String version) {
  Connection conn = new ApiConnection(version);
  response = conn.request("z", "foo_z")';
  assertEquals("bar_z", response);
}

这可能吗?

4

1 回答 1

0

从 JUnit 4 开始,您可以这样做。抬头看Categories

// In Version1.java.
public interface Version1 { /* category marker */ }

// In Version2.java.
public interface Version2 { /* category marker */ }

// Part of ApiV1Test.java
@Test
@Category({Version1.class, Version2.class})
public void featureX( String version) {
    Connection conn = new ApiConnection(version);
    response = conn.request("x", "foo")';
    assertEquals("bar", response);
}

// Part of ApiV2Test.java
@Test
@Category(Version2.class)
public void featureZ(String version) {
    Connection conn = new ApiConnection(version);
    response = conn.request("z", "foo_z")';
    assertEquals("bar_z", response);
}

//Part of V1TestSuite.java, chosen through an Ant target or Maven execution.
@RunWith(Categories.class)
@IncludeCategory(Version1.class)
@SuiteClasses(ApiV1Test.class, ApiV2Test.class)  // *
public class V1TestSuite {}

您可以根据需要将测试方法拆分为尽可能少或尽可能多的类。只需编辑标有星号的行。然后,V1TestSuite手动运行,或使用适当的方式让它由 Ant 目标或 Maven 执行测试步骤运行。

蚂蚁

<target name="text-version1" depends="compile-tests">
    <junit printsummary="yes" haltonfailure="yes">
        <classpath>
            <pathelement location="${build.tests}"/>
            <pathelement path="${java.class.path}"/>
        </classpath>

        <formatter type="plain"/>

        <test name="my.test.V1TestSuite"/>
    </junit>
</target>
于 2013-07-11T00:59:06.883 回答