无法从另一个 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);
    }
}