简体   繁体   中英

Usage of Config classes in integratiion testing scenario with @SpringJUnitConfig

I am trying to explore the Spring framework developing a very basic application based on one of my hobbies. There is a null error when trying to execute a test that i am not really not understanding.

I have a Class tagged as a @Component:

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

}

I have a @Configuration class that imports another Configuration for aspects and scans for component in different packages:

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 {
    
}

And in my test package i have a Config class that imports it:

package matchedbetting;

...

import config.MyTrainingConfig;


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

}

Now i run my test and everything looks fine:

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

Now i am trying to switch to Spring testing:

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

But the test comes out with the error that "bet" is null. I really don't understand what i am missing.

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)


Any thoughts?

Thank you

Trying to switch integration testing using @SpringJUnitConfig

i was running the @Test as Junit4. Just switched to org.junit.jupiter.api.Test and now running the test as JUnit5 ends like expected

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM