在Maven项目中,我在同一个包中有测试类和源类,但是在不同的物理位置.
.../src/main/java/package/** <-- application code
.../src/test/java/package/** <-- test code
Run Code Online (Sandbox Code Playgroud)
访问测试类中的源类没有问题,但是我想在main方法中运行一个测试运行器并访问它,AllTest.class以便我可以创建jar并执行我的测试.
public static void main(String[] args) {
// AllTest not found
Result result = JUnitCore.runClasses(AllTest.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用,因为我无法访问测试代码.我不明白,因为他们在同一个包中.
问题:如何从应用程序类访问测试类?或者,Maven如何打包包含测试类和执行测试的胖罐?
我使用shade maven插件来构建我的项目,以便它的所有依赖项都包含在一个jar中(这使得在Hadoop上运行它更容易).默认情况下,Shade似乎排除了我的测试代码,这是可以理解的.由于我想对我的集群运行集成测试,我希望设置另一个配置文件来为此目的构建一个单独的jar.有没有办法配置这个插件还包括测试代码?
我有一些Spring测试可以启动应用程序上下文并测试一些服务.我可以使用Maven和IDE运行这些测试.现在我需要在无法访问Maven的其他机器上运行这些测试.我的想法是创建一个测试jar并通过命令行运行它们.
所以我创建了一个自定义Runner来调用我需要的测试类,这些测试将启动Spring Application上下文并测试一些服务.
以下是示例代码:
我的自定义亚军:
public class Main {
public static void main(String[] args) {
System.out.println("Running tests!");
JUnitCore engine = new JUnitCore();
engine.addListener(new TextListener(System.out));
engine.run(SpringSampleTest.class);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的跑步者正在调用此测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {AppConfig.class})
public class SpringSampleTest {
@Autowired
TestService testService;
@Test
public void testSimple() {
assertTrue("Test Simple", testService.isValid());
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的配置和服务
@Configuration
@ComponentScan(basePackages = {"mypackage"})
public class AppConfig {
}
@Service
public class TestService {
public boolean isValid() {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,若要从罐子这些测试中,我用汇编插件来创建一个可执行的JAR,其中包括我的所有测试和依赖关系(感谢这个答案在这里).现在,当我运行这个可执行的JAR,我定制的运行(Main.java)能够触发测试,但它不加载Spring上下文,并与一个空指针异常失败,因为我的依赖不会被自动装配.这是日志:
Running tests!
Sep 05, 2018 …Run Code Online (Sandbox Code Playgroud)