0

我正在使用autowiring(@Autowired)在JUnit測試類中注入依賴項,並面臨NullPointerException。我想知道在JUnit測試課中/是否可以使用自動裝配。否則,如何在測試類中注入bean。我的代碼如下 -在JUnit中使用@Autowired測試類會拋出NullPointerException?

主類/客戶端 - 自動裝配按預期工作。

package com.example.demo; 
import javax.annotation.PostConstruct; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.annotation.ComponentScan; 
import com.example.demo.services.IMessage; 
import com.example.demo.services.SayWelcomeService; 
@SpringBootApplication 
@ComponentScan("com.example.demo.services") 
public class AutowireWithMultipleImplementationsApplication { 
    @Autowired 
    IMessage sayHelloService; 

    @Autowired 
    SayWelcomeService sayWelcome; 

    @Autowired 
    IMessage masterService; 

    public static void main(String[] args) { 
     SpringApplication.run(AutowireWithMultipleImplementationsApplication.class, args); 
    } 

    @PostConstruct 
    public void init() { 
     String message; 
     message=masterService.message("George"); 
     System.out.println("message: \n" + message); 

     message=sayWelcome.message("george"); 
     System.out.println("message: " + message);  
    } 
} 

服務接口和實現類
接口即時聊天

package com.example.demo.services; 
public interface IMessage { 
    String message(String name); 
} 

服務SayWelcomeService

package com.example.demo.services; 

import org.springframework.stereotype.Service; 

@Service 
public class SayWelcomeService implements IMessage { 

    @Override 
    public String message(String name) { 
     return "Welcome Dear User - " + name ; 
    } 
} 

服務SayHelloService

package com.example.demo.services; 

import org.springframework.stereotype.Service; 

@Service 
public class SayHelloService implements IMessage { 

    @Override 
    public String message(String name) { 
     return "Hello Dear User - " + name ; 
    } 
} 

主服務調用其他服務。自動裝配按預期工作。
MasterService

package com.example.demo.services; 

import java.util.List; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 

@Service 
public class MasterService implements IMessage { 

    @Autowired 
    List<IMessage> listOfServices; 

    @Autowired 
    IMessage sayHelloService; 

    @Autowired 
    SayWelcomeService sayWelcome; 

    @Override 
    public String message(String name) { 

     StringBuilder messages = new StringBuilder(); 
     for(IMessage m: listOfServices) 
     { 
      messages.append(m.message(name)); 
      messages.append("\n"); 
     } 

     System.out.println("....."); 
     System.out.println(sayHelloService.message(name)); 
     System.out.println(sayWelcome.message(name)); 

     return messages.toString(); 
    }  
} 

現在測試類。
SayWelcomeServiceTest

package com.example.demo.tests; 

import static org.hamcrest.CoreMatchers.equalTo; 
import static org.hamcrest.MatcherAssert.assertThat; 

import org.junit.Test; 
import org.springframework.beans.factory.annotation.Autowired; 

import com.example.demo.services.SayWelcomeService; 

public class SayWelcomeServiceTest { 

    @Autowired 
    SayWelcomeService sayWelcomeService; 

    @Test 
    public void testSayWelcomeMessage() 
    { 
     String message = sayWelcomeService.message("George"); 
     assertThat(message, equalTo("Welcome Dear User - George")); 
    }  
} 

的問題是在上述類。 @Autowired字段(sayWelcomeService)爲空。爲什麼?如何解決這個問題?

+0

請看看:https://stackoverflow.com/questions/21878714/how-to-write-junit-test-with-spring-autowire – DevDio

回答

1

需要兩個註釋來連接bean。它們是強制性的,否則測試將失敗。

下面是工作測試類:

@SpringBootTest 
    @RunWith(SpringRunner.class) 
    public class SayWelcomeServiceTest { 

    @Autowired 
    private SayWelcomeService sayWelcomeService; 

    @Test 
    public void testSayWelcomeMessage() 
    { 
     String message = sayWelcomeService.message("George"); 
     assertThat(message, equalTo("Welcome Dear User - George")); 
    }  
} 

的更多信息在Spring Boot Docs

彈簧引導提供了@SpringBootTest註解,其可以用作 到標準彈簧測試的替代@ContextConfiguration 當您需要Spring Boot功能時進行註釋。註釋的作用是 通過 SpringApplication創建在測試中使用的ApplicationContext。

相關問題