junit无法从另一个java类访问方法
我有这张银行卡
public class Bank {
public Map<String, Account> accounts;
Bank() {
accounts = new HashMap<>();
}
public void addAccount(String accountType, int accountNumber, double apr) {
accounts.put(accountType, new Account(accountNumber, apr) {
});
}
public Map<String, Account> getAccounts() {
return accounts;
}
}
我还有另一个类,我试图从Bank类调用addAccount方法
public class Processor {
Bank bank = new Bank();
public void openCheckingsAccount(String accType, int accNum, double apr) {
bank.addAccount(accType, accNum, apr);
}
}
我有一个JUnit测试类,以确保我可以使用处理器类中的方法在Bank类中创建一个新帐户
public class ProcessorTest {
Bank bank;
Processor processor;
@BeforeEach
void setUp() {
bank = new Bank();
}
@Test
void create_checkings_and_verify_by_id_apr() {
processor.openCheckingsAccount("checkings", 11111111, 0.6);
System.out.println(bank.accounts);
assertEquals(11111111, bank.getAccounts().get("checkings").getAccountNumber());
}
}
但是System.out.println(bank.accounts)
的结果只是{},在运行JUnit测试时,我得到了一个java.lang.NullPointerException
错误
# 1 楼答案
您的
Processor
类有自己的Bank
实例。我想这不是你想要的。这就是为什么当您在单元测试中执行bank.getAccounts().get("checkings").getAccountNumber()
时,会得到一个NullPointerException
。您在测试中得到的是bank
变量中的帐户,而不是Processor
类中的Bank
对象您需要更改
Processor
类以在其构造函数中接收Bank
对象,如下所示:现在也相应地更改您的测试:
现在,测试中只有
Bank
实例被Processor
类更改另外,请避免在类中使用公共属性(例如:
public Map<String, Account> accounts;
在Bank
类中)。它们应该是私有的,并且可以通过类中的方法访问。此外,请记住,当您在getAccounts()
方法中返回Bank
中的Map
时,调用者现在有一个对Map
的引用,并且可以在他认为合适的情况下更改它。话虽如此,您应该考虑返回一个新的^ {< CD14>}(感谢@ CelyIs谨慎乐观-对于^ {CD19>}的提示):