簡體   English   中英

使用 TestNG 和 Spring 上下文運行測試時,自動裝配失敗,結果為空

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM