java - 使用 TestNG 和 Spring 上下文运行测试时,Autowired 失败并返回 null 结果

标签 java spring maven nullpointerexception inversion-of-control

我使用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
===============================================

web.xml

 <web-app>
 <display-name>Archetype Created Web Application</display-name>
 </web-app>

applicationContext.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>

Person.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");
    }
}

Apptest.java

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());
    }
}

Person.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>

图片 enter image description here

最佳答案

因为您的 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());
    }
}

关于java - 使用 TestNG 和 Spring 上下文运行测试时,Autowired 失败并返回 null 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40944424/

相关文章:

java - 基本GUI程序布局定位

java - Spring 3 的新特性是什么(与 Spring 2.5 相比)?

java - JSP 使用 Spring MVC 获取/发布

java - pom.xml Maven 配置以在混合 Java + Kotlin 项目中运行 JUnit 4 + JUnit 5 Jupiter 测试

java - 仅 Hibernate 注释包

java - 如何从 Java 客户端(无 CSV 文件)创建 BigQuery 数据集和表/模式

java - 如何检查文件是否可以删除?

java - 仅在java字符串中使用双引号(无空格) ""

java - 带有依赖项配置文件的 Spring Boot 属性

java - FindBugs IntelliJ 和 Maven 中的匹配错误级别