我有一些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);
}
}
上面的运行程序正在调用此测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {AppConfig.class})
public class SpringSampleTest {
@Autowired
TestService testService;
@Test
public void testSimple() {
assertTrue("Test Simple", testService.isValid());
}
}
这是我的配置和服务
@Configuration
@ComponentScan(basePackages = {"mypackage"})
public class AppConfig {
}
@Service
public class TestService {
public boolean isValid() {
return true;
}
}
因此,为了从jar运行这些测试,我使用汇编插件创建了一个可执行的jar,其中包括我的所有测试和依赖项(感谢这里的回答)。现在,当我运行这个可执行jar时,我的自html" target="_blank">定义运行程序(Main.java)能够触发测试,但它没有加载Spring上下文,并且由于依赖项没有自动连接而导致NullPointer异常而失败。以下是日志:
Running tests!
Sep 05, 2018 5:15:01 PM org.springframework.test.context.support.DefaultTestContextBootstrapper getDefaultTestExecutionListenerClassNames
INFO: Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: []
Sep 05, 2018 5:15:01 PM org.springframework.test.context.support.DefaultTestContextBootstrapper getTestExecutionListeners
INFO: Using TestExecutionListeners: []
.E
Time: 0.007
There was 1 failure:
1) testSimple(com.c0deattack.cu.runners.SpringSampleTest)
java.lang.NullPointerException
at com.c0deattack.cu.runners.SpringSampleTest.testSimple(SpringSampleTest.java:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at org.junit.runner.JUnitCore.run(JUnitCore.java:105)
at org.junit.runner.JUnitCore.run(JUnitCore.java:94)
at com.c0deattack.cu.runners.Main.main(Main.java:15)
FAILURES!!!
Tests run: 1, Failures: 1
有人能指出我做错了什么吗?
我也在添加我的pom。xml和程序集描述符文件:
pom。xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>mypackage</groupId>
<artifactId>executable-tests</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>executable-tests</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.2.RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
<configuration>
<archive>
<manifest>
<mainClass>mypackage.Main</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
描述符-程序集。xml
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>fat-tests</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>test</scope>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.directory}/test-classes</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>**/*.class</include>
</includes>
<useDefaultExcludes>true</useDefaultExcludes>
</fileSet>
</fileSets>
</assembly>
您可以在github中查看示例项目:https://github.com/SaiUpadhyayula/executabletests
<罢工>
如果maven安装不可行,那么创建一个包含测试类的jar,并使用这个jar来运行测试。查看maven文档-http://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html
在调试测试之后,我终于发现了问题,结果表明,Spring在引导TestContext时,将查找META-INF/Spring中定义的TestExecutionListener。工厂文件位于spring测试jar中。
今年Spring。工厂文件最好放在可执行jar的META-INF文件夹中。但组装插件所做的是,它没有添加正确的spring。工厂文件,其中包含必要的TestExecutionListener
将此文件添加到src/main/resources/META-INF/spring。工厂解决了这个问题
# Default TestExecutionListeners for the Spring TestContext Framework
#
org.springframework.test.context.TestExecutionListener = \
org.springframework.test.context.web.ServletTestExecutionListener,\
org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener,\
org.springframework.test.context.support.DependencyInjectionTestExecutionListener,\
org.springframework.test.context.support.DirtiesContextTestExecutionListener,\
org.springframework.test.context.transaction.TransactionalTestExecutionListener,\
org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener
# Default ContextCustomizerFactory implementations for the Spring TestContext Framework
#
org.springframework.test.context.ContextCustomizerFactory = \
org.springframework.test.context.web.socket.MockServerContainerContextCustomizerFactory
我刚刚从您的存储库中找到了错误。Spring工厂必须与maven抛出测试时使用的工厂相同。必须以与测试上下文相同的方式委托到Spring Ic中。
有关其他信息,请参阅拉取请求:
https://github.com/SaiUpadhyayula/executabletests/pull/2
我有一个项目与cucumber和maven也我使用JUnit。 我能够从Eclipse成功地运行和构建我的项目。 现在,我想在另一个没有安装eclipse或cucumber的系统中从命令行运行测试。我有一个想法,我们可以从JAR创建一个JAR,我们可以通过java cli命令运行测试。 我已经在类路径中添加了JUNIT Jar。 我以两种方式生成jar, 1)使用->project->export
我在Eclipse中有一个maven项目。在src/main/resources下,我有一个名为“directoryToCopy”的目录,其中包含文件。一旦我运行了我的项目,我想将“directoryToCopy”复制到桌面上的本地目录“localDirec”下。 我用了这个: 这在本地工作正常,但是当我想将其作为可执行jar文件运行时,我会得到NullPointerException。 请问有什
我在Eclipse IDE中使用Java编写了一个简单的Selenium+TestNG maven项目(例如,在目录中),当我右键单击该项目并运行文件以启动Chrome浏览器时,我现在将该项目导出为“可运行JAR文件”并将JAR保存在桌面()。 现在, 如果我从项目目录中运行保存的可执行jar,并双击该jar,就能够启动Chrome浏览器,即,但是 如果我从desktop保存可执行jar,无法启动
步骤1:在此基础上,我使用构建了一个包含所有依赖项的独立jar。 pom.xml 将方法添加到runner类,并根据this、this和this传递cmdline arg。 如何通过cmdline args指向JAR中的目录?
提前道谢。 更新:在另一台机器上尝试相同的jar后,问题会改变。现在,我可以确认这些图像不是可执行的“胖”jar的一部分,因为这些图像不会出现在网页上。更进一步说,“webapp”下的文件没有一个打包在jar中。我已经把spring-boot-maven-plugin插件放在pom中,并使用“mvn package”来创建JAR。在我的src项目中,webapp在src/main之下(与java和
我在Netbeans IDE 8.0.1中编写了一个名为SampleChat的Java GUI程序,并使用“Clean and Build”函数创建了一个jar文件。 我转到Netbeans创建的'dist'目录,双击它生成的jar文件。打开一个cmd窗口,其行如下: 我打算从一个U盘共享程序,所以它是至关重要的,唯一的要求是一个JVM,鼠标,也许一些手指来双击它。 我想出的一个尴尬的解决方案是编