Ama*_*eye 1 java tdd junit mockito
我是 Java 新手,对使用 JUnit 和 Mockito 测试代码感到困惑。
我在 github 上分叉了一个项目,其中的任务是编写 Junit 测试, 
 AccountService它是一个接口。我不知道的是我必须测试什么?接口或实现接口的类?
这是AccountService:
public interface AccountService {
    public Operation deposit(String accountNumber, int amount);
    public Operation withdraw(String accountNumber, int amount);
    public OperationsDto history(String accountNumber);
}
这是AccountService实现
@Service
public class AccountServiceImpl implements  AccountService {
    @Autowired
    private AccountRepository accountRepository;
    @Autowired
    private OperationRepository operationRepository;
    @Autowired
    OperationConverter operationConverter;
    public Operation deposit(String accountNumber, int amount) {
        checkAmount (amount);
        AccountEntity account = getAccount (accountNumber);
        int balance =  account.getBalance();
        balance = balance + amount;
        OperationEntity operation = new OperationEntity();
        operation.setAccount(accountNumber);
        operation.setAmount(amount);
        operation.setType(OperationType.DEPOSIT.toString());
        operation.setDate(DateUtil.getCurrentDate());
        operation.setBalance(balance);
        operationRepository.save(operation);
        //update account balance
        account.setBalance(balance);
        accountRepository.save(account);
        return  operationConverter.convert(operation);
    }
    public Operation withdraw(String accountNumber, int amount) {
        checkAmount (amount);
        AccountEntity account = getAccount (accountNumber);
        int balance = account.getBalance();
        balance = balance - amount;
        if(balance < 0){
            throw new OperationException(Constants.ERROR_INVALID_OPERATION);
        }
        OperationEntity operation = new OperationEntity();
        operation.setBalance(balance);
        operation.setAccount(accountNumber);
        operation.setAmount(amount);
        operation.setType(OperationType.WITHDRAW.toString());
        operation.setDate(DateUtil.getCurrentDate());
        operationRepository.save(operation);
        //update account balance
        account.setBalance(balance);
        accountRepository.save(account);
        return  operationConverter.convert(operation);
    }
    public OperationsDto history(String accountNumber) {
        List<OperationEntity>  operations = 
        operationRepository.findByAccount(accountNumber);
        return operationConverter.convertList(operations);
    }
    private AccountEntity getAccount(String accountNumber){
        AccountEntity account = 
        accountRepository.findByNumber(accountNumber);
        if(account == null) {
            throw new AccountException(Constants.ERROR_INVALID_ACCOUNT);
        }
        return account;
    }
    private void checkAmount (int amount) {
        if(amount < 0){
            throw new OperationException(Constants.ERROR_INVALID_OPERATION);
        }
    }
}
你应该测试实现,因此,类。
该接口应仅用于注射。因此,查看您发布的代码,您应该AccountServiceImpl在AccountServiceImplTest类(或类似的东西)中测试该类。
在这个单元测试中,你应该模拟AccountRepository,OperationRepository和OperationConverter. 在测试单元中,您应该只测试对测试感兴趣的类,而不是它的依赖项。因此,您使用@Autowired. 通过这种方式,您可以使用模拟框架模拟您的类依赖项,隔离您需要测试的单元。
看看您发布的课程:您正在使用注释注入三个 bean。我很确定这些类型都是接口。当您部署应用程序时,Spring CDI 将负责在启动容器(或正确运行 Spring Boot)后立即注入实际实现。当你运行这个类时,你想隔离它。测试应该尽可能的原子化。使用 Mockito 和正确的 JUnit 运行程序,您将为注入的 bean 提供一个假实现。使用 Mockito API,你可以知道这个虚假的实现应该如何响应某个请求。所以你采取的实施AccountServiceImpl,模拟其所有依赖项,然后仅测试该类中包含的逻辑。您不测试接口,因为接口仅代表调用服务的契约,而不是其实现。
@RunWith(MockitoJUnitRunner.class)
public class AccountServiceTest {
@Mock
private AccountRepository accountRepository;
@Mock
private OperationRepository operationRepository;
@Mock
OperationConverter operationConverter;
@InjectMocks
private AccountServiceImpl accountService;
@Before
public void setUp() {
    /* here goes before-class init logic */
}
@Test
public void testMethod1() {
    /* here you test a method*/
}
@Test
public void testMethod2() {
    /* here you test another method*/
}
}
这就是您的测试类应该如何出现。
| 归档时间: | 
 | 
| 查看次数: | 889 次 | 
| 最近记录: |