首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试接口还是类?

测试接口还是类?
EN

Stack Overflow用户
提问于 2018-05-22 12:39:11
回答 1查看 1.3K关注 0票数 1

我对java很陌生,我对用JUnit和Mockito测试代码感到困惑。

我在github上创建了一个项目,任务是为AccountService编写Junit测试,这是一个接口。我不知道的是我要测试什么?接口还是实现接口的类?

这是AccountService

代码语言:javascript
复制
public interface AccountService {
    public Operation deposit(String accountNumber, int amount);
    public Operation withdraw(String accountNumber, int amount);
    public OperationsDto history(String accountNumber);
}

下面是AccountService实现

代码语言:javascript
复制
@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);
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-22 12:45:31

您应该测试实现,因此,类。

接口应该只用于注射。因此,看看您已经发布的代码,您应该在一个AccountServiceImpl类(或类似的类)中测试这个类。

在这个单元测试中,您应该模拟AccountRepositoryOperationRepositoryOperationConverter。在测试单元中,您应该只测试对测试感兴趣的类,而不是它的依赖项。因此,您可以使用@Autowired注入接口。通过这种方式,您可以使用模拟框架来模拟您的类依赖关系,隔离您需要测试的单元。

看看您发布的类:您正在使用注释注入三个bean。我很确定这些类型都是接口。部署应用程序时,Spring将负责在启动容器(或正确运行Spring )之后注入实际实现。当您运行这个类时,您希望隔离它。测试应该尽可能是原子化的。使用Mockito和正确的JUnit运行程序,您将为注入的bean提供一个假实现。使用Mockito,您可以知道这个假实现应该如何响应某个请求。因此,您可以使用AccountServiceImpl的实现,模拟它的所有依赖项,而不是只测试该类中包含的逻辑。您不测试接口,因为接口只代表调用服务的契约,而不是它的实现。

代码语言:javascript
复制
@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*/
}
}

这就是测试类应该显示的方式。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50467966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档