![](/img/trans.png)
[英]Upgraded to Spring 3 and junit 11 - Context becoming null after running a test. No autowired bean available for the second test
[英]Autowired failed with null result when running test with TestNG and Spring context
我正在使用 maven 構建 spring,我不知道我錯在哪里,spring ioc 我已經添加了這個 bean 但仍然出現以下錯誤
[TestNG] Running:
C:\Users\lw\AppData\Local\Temp\testng-eclipse-280706424\testng-customsuite.xml
null
[Utils] Attempting to create D:\lw\workspace\spring\test-output\Default suite\Default test.xml
[Utils] Directory D:\lw\workspace\spring\test-output\Default suite exists: true
FAILED: testIOC
java.lang.NullPointerException
at com.syz.test01.AppTest.testIOC(AppTest.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.j ava:100)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:646)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:811)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1137)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129 )
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
at org.testng.TestRunner.privateRun(TestRunner.java:753)
at org.testng.TestRunner.run(TestRunner.java:607)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:368)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:363)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:321)
at org.testng.SuiteRunner.run(SuiteRunner.java:270)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1284)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1209)
at org.testng.TestNG.runSuites(TestNG.java:1124)
at org.testng.TestNG.run(TestNG.java:1096)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:236)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:81)
===============================================
Default test
Tests run: 1, Failures: 1, Skips: 0
===============================================
===============================================
Default suite
Total tests run: 1, Failures: 1, Skips: 0
===============================================
網頁.xml
<web-app>
<display-name>Archetype Created Web Application</display-name>
</web-app>
應用上下文.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">
<context:component-scan base-package="com.syz.test01" />
</beans>
人.java
package com.syz.test01;
@Component
public class Person {
public String name = "zhangsan";
public String age = "1";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
應用程序.java
package com.syz.test01;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ClassPathXmlApplicationContext;
@Component
public class App {
@Autowired
public Person person;
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public void testIOC()
{
System.out.println("hello");
}
}
應用測試程序
package com.syz.test01;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.testng.annotations.Test;
@ContextConfiguration(locations = { "classpath*:applicationContext.xml" })
public class AppTest {
@Autowired
public App app ;
public App getApp() {
return app;
}
public void setApp(App app) {
this.app = app;
}
@Test
public void testIOC() {
System.out.println(app);
System.out.println(app.getPerson().getName());
}
}
人.java
package com.syz.test01;
@Component
public class Person {
public String name = "zhangsan";
public String age = "1";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.spring</groupId>
<artifactId>spring</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>spring Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.1.RELEASE</version>
</dependency>
</dependencies>
<build>
<finalName>spring</finalName>
</build>
</project>
圖片在此輸入圖片說明
因為您的 bean 是由“組件掃描”加載的,所以您必須使用@Component
注釋您的組件:
@Component
public class Person {
....
}
和
@Component
public class App {
....
}
更新:
測試類AppTest.java必須用@ContextConfiguration
注釋:
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
確保 TestNG 可以通過更正其路徑來查看和加載文件 applicationContext.xml。
更新 2:
要獲得工作,您可能需要在 pom.xml 中添加對 spring-test 的依賴:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.4.RELEASE</version>
<scope>test</scope>
</dependency>
更新 3:
將此添加到AppTest.java :
@org.junit.runner.RunWith(org.springframework.test.context.junit4.SpringJUnit4ClassRunner.class)
這會指示 junit 作為 Spring 測試執行測試。
請注意, SpringJUnit4ClassRunner
僅適用於 junit 4.5+,因此請將您對 junit 的依賴更新為最新:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
完成
這是完整的工作AppTest.java 。 請注意,為了與 Spring 測試框架兼容,一些 testng 注釋已被 junit 替換。
package com.syz.test01;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@org.junit.runner.RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:applicationContext.xml" })
public class AppTest{
@Autowired
public App app;
public App getApp() {
return app;
}
public void setApp(App app) {
this.app = app;
}
@org.junit.Test
public void testIOC() {
System.out.println(app);
System.out.println(app.getPerson().getName());
}
}
您沒有在應用程序類中為 Person 類提供任何值。 所以這意味着在 AppTester 中,當它調用app.getPerson
時,它發送的是一個空值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.