有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    您的Processor类有自己的Bank实例。我想这不是你想要的。这就是为什么当您在单元测试中执行bank.getAccounts().get("checkings").getAccountNumber()时,会得到一个NullPointerException。您在测试中得到的是bank变量中的帐户,而不是Processor类中的Bank对象

    您需要更改Processor类以在其构造函数中接收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类更改

    另外,请避免在类中使用公共属性(例如:public Map<String, Account> accounts;Bank类中)。它们应该是私有的,并且可以通过类中的方法访问。此外,请记住,当您在getAccounts()方法中返回Bank中的Map时,调用者现在有一个对Map的引用,并且可以在他认为合适的情况下更改它。话虽如此,您应该考虑返回一个新的^ {< CD14>}(感谢@ CelyIs谨慎乐观-对于^ {CD19>}的提示):

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