簡體   English   中英

使用 @SpringJUnitConfig 在集成測試場景中使用 Config 類

[英]Usage of Config classes in integratiion testing scenario with @SpringJUnitConfig

我正在嘗試探索 Spring 框架,根據我的一個愛好開發一個非常基本的應用程序。 嘗試執行我並非真的不理解的測試時出現 null 錯誤。

我有一個標記為 @Component 的 Class:

package matchedbetting;

...

@Component("bet")
public class Bet {

    private String team1;
    private String team2;

...

    public Bet(String team1, String team2, String league, double bookmaker, double exchange, double commission) {
        super();
        this.team1 = team1;
        this.team2 = team2;
    ...
        this.commission = commission;
    }

    @Autowired
    public Bet() {
        super();
    }

}

我有一個@Configuration class,它為方面導入另一個配置並掃描不同包中的組件:

package config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({AspectsConfig.class})
@ComponentScan({"matchedbetting","utils"})
public class MyTrainingConfig {
    
}

在我的測試 package 中,我有一個導入它的配置 class:

package matchedbetting;

...

import config.MyTrainingConfig;


@Configuration
@Import({MyTrainingConfig.class})
public class MatchedBettingTestConfig {
    
    @Bean MatchedBetting matchedBetting() {
        return new MatchedBettingImpl();
    }
    

}

現在我運行我的測試,一切看起來都很好:

package matchedbetting;
...
import org.springframework.context.ConfigurableApplicationContext;

import utils.FieldConsistency;


public class MatchedBettingImplTests {

    private ConfigurableApplicationContext context;
    private Bet bet;
    private FieldConsistency fieldConsistency;
    private MatchedBetting matchedBetting;
    
    @Before
    public void setUp() {
        
        context = SpringApplication.run(MatchedBettingTestConfig.class);

        bet = context.getBean(Bet.class);
        fieldConsistency = context.getBean(FieldConsistency.class);
        matchedBetting = context.getBean(MatchedBetting.class);
        
    }

    @Test
    public void test() {
        
        setTestingBet(bet);
        fieldConsistency.checkTeam(bet);
        System.out.println("Rating Bet: " + matchedBetting.calculateRating(bet));
        
    }

    private void setTestingBet(Bet bet) {
        bet.setTeam1("teamA");
        ...
        bet.setCommission(0.01);
    }
}

現在我正在嘗試切換到 Spring 測試:

package matchedbetting;

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

import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;

import utils.FieldConsistency;

@SpringJUnitConfig(classes=MatchedBettingTestConfig.class)
public class MatchedBettingImplTests {

    @Autowired
    private Bet bet;
    
    @Autowired
    private MatchedBetting matchedBetting;
    
    @Autowired
    private FieldConsistency fieldConsistency;
    


    @Test
    public void test() {
        setTestingBet(bet);
        fieldConsistency.checkTeam(bet);
        System.out.println("Rating Bet: " + matchedBetting.calculateRating(bet));
        
    }

    private void setTestingBet(Bet bet) {
        bet.setTeam1("teamA");
...
        bet.setCommission(0.01);
    }
}

但是測試出來的錯誤是“打賭”是null。我真的不明白我錯過了什么。

java.lang.NullPointerException: Cannot invoke "matchedbetting.Bet.setTeam1(String)" because "bet" is null
    at matchedbetting.MatchedBettingImplTests.setTestingBet(MatchedBettingImplTests.java:35)
    at matchedbetting.MatchedBettingImplTests.test(MatchedBettingImplTests.java:28)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    at java.base/java.lang.reflect.Method.invoke(Method.java:578)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
    at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
    at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
    at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:93)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:40)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:529)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:756)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:452)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)


有什么想法嗎?

謝謝

嘗試使用@SpringJUnitConfig 切換集成測試

我正在以 Junit4 的身份運行@Test。 剛剛切換到 org.junit.jupiter.api.Test 現在運行測試作為 JUnit5 結束如預期

package matchedbetting;



import org.junit.jupiter.api.Test;  //changed this
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;

import utils.FieldConsistency;

@SpringJUnitConfig(classes=MatchedBettingTestConfig.class)
public class MatchedBettingImplTests {

    @Autowired
    private Bet bet;
    
    @Autowired
    private MatchedBetting matchedBetting;
    
    @Autowired
    private FieldConsistency fieldConsistency;
    


    @Test //changed this
    public void test() {
        setTestingBet(bet);
        fieldConsistency.checkTeam(bet);
        System.out.println("Rating Bet: " + matchedBetting.calculateRating(bet));
        
    }

    private void setTestingBet(Bet bet) {
        bet.setTeam1("teamA");
        bet.setBookmaker(1.5);
        bet.setExchange(2);
        bet.setCommission(0.01);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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