无法从另一个 java class 访问方法
Cannot access method from another java class
我有这家银行class
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;
}
}
我还有另一个 class,我试图从银行调用 addAccount 方法 class
public class Processor {
Bank bank = new Bank();
public void openCheckingsAccount(String accType, int accNum, double apr) {
bank.addAccount(accType, accNum, apr);
}
}
我有一个 JUnit 测试 class 以确保我可以使用我的处理器 class 中的方法在银行 class 中创建一个新帐户 class。
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
错误。
您的 Processor
class 有自己的 Bank
实例。我想这不是你想要的。这就是为什么当您在单元测试中执行 bank.getAccounts().get("checkings").getAccountNumber()
时,您会得到 NullPointerException
。您在测试中获取 bank
变量中的帐户,而不是 Processor
class.
中的 Bank
对象
您需要更改 Processor
class 以在其构造函数中接收 Bank
对象,如下所示:
public class Processor {
private Bank bank;
public Processor(Bank bank) {
this.bank = bank;
}
public void openCheckingsAccount(String accType, int accNum, double apr) {
bank.addAccount(accType, accNum, apr);
}
}
现在也相应地更改您的测试:
public class ProcessorTest {
Bank bank;
Processor processor;
@BeforeEach
void setUp() {
bank = new Bank();
processor = new Processor(bank);
}
@Test
void create_checkings_and_verify_by_id_apr() {
processor.openCheckingsAccount("checkings", 11111111, 0.6);
System.out.println(bank.getAccounts());
assertEquals(11111111, bank.getAccounts().get("checkings").getAccountNumber());
}
}
现在您的测试中只有 Bank
个实例被您的 Processor
class 更改了。
作为旁注,请避免在您的 class 中包含 public 属性(例如:在您的 Bank
class 中包含 public Map<String, Account> accounts;
)。它们应该是私有的,并且可以通过 class 中的方法访问。此外,请记住,当您在 getAccounts()
方法中 return Bank
中的 Map
时,调用者现在拥有对 Map
的引用并且可以更改它但是他可能认为合适。话虽如此,您应该考虑 return 一个新的 Map
(感谢 @chrylis-cautiouslyoptimistic- 对 Collections. unmodifiableMap
的提示):
public class Bank {
private Map<String, Account> accounts;
public 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 Collections.unmodifiableMap(accounts);
}
}
我有这家银行class
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;
}
}
我还有另一个 class,我试图从银行调用 addAccount 方法 class
public class Processor {
Bank bank = new Bank();
public void openCheckingsAccount(String accType, int accNum, double apr) {
bank.addAccount(accType, accNum, apr);
}
}
我有一个 JUnit 测试 class 以确保我可以使用我的处理器 class 中的方法在银行 class 中创建一个新帐户 class。
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
错误。
您的 Processor
class 有自己的 Bank
实例。我想这不是你想要的。这就是为什么当您在单元测试中执行 bank.getAccounts().get("checkings").getAccountNumber()
时,您会得到 NullPointerException
。您在测试中获取 bank
变量中的帐户,而不是 Processor
class.
Bank
对象
您需要更改 Processor
class 以在其构造函数中接收 Bank
对象,如下所示:
public class Processor {
private Bank bank;
public Processor(Bank bank) {
this.bank = bank;
}
public void openCheckingsAccount(String accType, int accNum, double apr) {
bank.addAccount(accType, accNum, apr);
}
}
现在也相应地更改您的测试:
public class ProcessorTest {
Bank bank;
Processor processor;
@BeforeEach
void setUp() {
bank = new Bank();
processor = new Processor(bank);
}
@Test
void create_checkings_and_verify_by_id_apr() {
processor.openCheckingsAccount("checkings", 11111111, 0.6);
System.out.println(bank.getAccounts());
assertEquals(11111111, bank.getAccounts().get("checkings").getAccountNumber());
}
}
现在您的测试中只有 Bank
个实例被您的 Processor
class 更改了。
作为旁注,请避免在您的 class 中包含 public 属性(例如:在您的 Bank
class 中包含 public Map<String, Account> accounts;
)。它们应该是私有的,并且可以通过 class 中的方法访问。此外,请记住,当您在 getAccounts()
方法中 return Bank
中的 Map
时,调用者现在拥有对 Map
的引用并且可以更改它但是他可能认为合适。话虽如此,您应该考虑 return 一个新的 Map
(感谢 @chrylis-cautiouslyoptimistic- 对 Collections. unmodifiableMap
的提示):
public class Bank {
private Map<String, Account> accounts;
public 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 Collections.unmodifiableMap(accounts);
}
}