1

Я построить пружину с помощью Maven, я не знаю, где я не прав, Spring IoC у меня есть добавить эти бобы, но по-прежнему появляется ошибка следовать заNullPointerException при выполнении теста с TestNG и Spring контексте

[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> 

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; 

    } 
} 

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

+0

Что такое строка 20 в AppTest.java? –

+0

Из сообщения об ошибке, скорее всего, 'System.out.println (app.getPerson(). GetName());'. Ошибка сообщает вам, что либо 'app' является' null', либо 'getPerson()' возвращает 'null'. Вам нужно определить, что это такое и почему. –

+0

Я использую testNG для проверки функции springIOC, строка 20 AppTest.java должна проверить метод testIOC() в App.java – liwei

ответ

0

Поскольку ваши бобы загружаются в "компонент сканирования", вы должны аннотировать компоненты с @Component:

@Component 
public class Person { 
.... 
} 

и

@Component 
public class App { 
.... 
} 

UPDATE:

Теста класс AppTest.java должен быть аннотирован @ContextConfiguration :

@ContextConfiguration(locations = { "classpath:applicationContext.xml" }) 

убедитесь TestNG можно увидеть и загрузить файл applicationContext.xml, исправляя его путь.

UPDATE 2:

Чтобы получить работы, возможно, потребуется добавить зависимость к весне-тест в вашем pom.xml:

<!-- 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> 

UPDATE 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. Обратите внимание, что некоторые аннотации testng были заменены на junit для совместимости с Spring test framework.

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

Я добавляю @Component в место буксировки, но приложение равно null – liwei

+0

после того, как оно добавлено: ContextConfiguration не может быть разрешен для типа – liwei

+0

ContextConfiguration - от spring-test (https://mvnrepository.com/artifact/org.springframework/ весенне-тест/4.3.4.RELEASE). Добавьте весенний тест к вашему pom.xml и импортируйте ContextConfiguration в свой AppTest – ntahoang

0

Вы не даете никаких значений в классе Person в своем классе приложений. Таким образом, это означает, что в AppTester, когда он вызывает app.getPerson, он отправляет нулевое значение.

+0

BeanFactory bf = new ClassPathXmlApplicationContext ("applicationContext.xml"); Приложение at = (приложение) bf.getBean («приложение»); Я использую этот метод правильно, возможно ли, что Autowired не создает beans? – liwei