0

我的会计示例有什么问题?Calculator bean 不会被注入到 Account 中。存款方法中存在空指针异常,因为计算器为空。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/META-INF/spring/context.xml")
public class DITestJavaTest extends Assert {
    @Test
    public void diTest() {
        Account account = new Account(500);
        account.deposit(500);
        assertEquals("balance is 1000", 1000, account.getBalance(), 0.0001);
    }
}
public class Account {

    @Autowired
    private ICalculator calculator;

    private double balance;

    public Account() {
        balance = 0;
    }

    public Account(double balance) {
        this.balance = balance;
    }

    public void deposit(double amount) {
        balance = calculator.add(balance, amount);
    }

    public void withdraw(double amount) {
        balance = calculator.subtract(balance, amount);
    }

    public double getBalance() {
        return balance;
    }

}    
@Component
public class Calculator implements ICalculator {

    @Override
    public double add(double summand1, double summand2) {
        System.out.println("Main implementation with " + Calculator.class.getName() + "addition");
        BigDecimal result = round(summand1 + summand2);
        return result.doubleValue();
    }

    @Override
    public double subtract(double minuend, double subtrahend) {
        System.out.println("Main implementation with " + Calculator.class.getName() + "subtraction");
        BigDecimal result = round(minuend - subtrahend);
        return result.doubleValue();
    }

    private BigDecimal round(double amount) {
        return new BigDecimal(amount).setScale(2, BigDecimal.ROUND_HALF_UP);
    }

}    
<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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="org.example.banking" />
    <context:annotation-config />

</beans>
4

2 回答 2

2
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/META-INF/spring/context.xml")
public class DITestJavaTest extends Assert {

@Autowired
Account account

@Test
public void diTest() {
    account.deposit(500);
    account.deposit(500);
    assertEquals("balance is 1000", 1000, account.getBalance(), 0.0001);
}

}

不要在测试中初始化帐户。这样它就不是由 Spring 管理的,并且Calculator永远不会被注入

并按照建议,Account@Component

于 2013-03-28T11:30:15.087 回答
0

You need to anotate Account class as well to tell spring that it contains annotated member.

Somethng like

@Component 
public class Account { ... }
于 2013-03-28T10:04:15.390 回答