Верно ли тестирование кода для моего метода обслуживания с использованием JUnit? - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть метод, который добавляет деньги на счет. Я новичок в тестировании, никогда раньше не тестировал.

public Optional<Account> addMoneyToBalance(Long id, Float money) {
        Optional<Account> accountFromDb = accountRepository.findById(id);
        float result;
        if (accountFromDb.isPresent()) {
            Account account = accountFromDb.get();
            result = account.getTotalBalance();
            result += money;
            account.setTotalBalance(result);
            accountRepository.save(account);
        }else throw new AccountNotFoundException("Account not found");

        return accountFromDb;
    }

Если я сохраню accountRepository.save(account), изменится ли он в database(accountFromDB)?

это правда тест? :

@RunWith(SpringRunner.class)
@SpringBootTest
public class FrugalBudgetingApplicationTests {

    @Autowired
    private AccountService accountService;
    @Autowired
    private AccountRepository accountRepository;


    @Test
    public void contextLoads() {
        List<Bank> banks = new ArrayList<>();
        banks.add(new Bank("OTP", 1239.2f));
        banks.add(new Bank("UKRsib", 549.2f));
        Account account = new Account(1912.2f, 200.45f, banks);
        accountRepository.save(account);
        Optional<Account> account1 = accountService.addMoneyToBalance(1L, 92f);
        Assert.assertNull(account1);
    }

}

результат теста:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.korzhov.frugalbudgeting.entities.Account.banks, could not initialize proxy - no Session
    at java.base/java.lang.String.valueOf(String.java:2951)
    at java.base/java.lang.StringBuilder.append(StringBuilder.java:168)
    at com.korzhov.frugalbudgeting.entities.Account.toString(Account.java:15)
    at java.base/java.util.Formatter$FormatSpecifier.printString(Formatter.java:3031)
    at java.base/java.util.Formatter$FormatSpecifier.print(Formatter.java:2908)
    at java.base/java.util.Formatter.format(Formatter.java:2673)
    at java.base/java.util.Formatter.format(Formatter.java:2609)
    at java.base/java.lang.String.format(String.java:2897)
    at java.base/java.util.Optional.toString(Optional.java:466)
    at java.base/java.lang.String.valueOf(String.java:2951)
    at java.base/java.lang.StringBuilder.append(StringBuilder.java:168)
    at org.junit.Assert.failNotNull(Assert.java:755)
    at org.junit.Assert.assertNull(Assert.java:737)
    at org.junit.Assert.assertNull(Assert.java:747)
    at com.korzhov.frugalbudgeting.FrugalBudgetingApplicationTests.contextLoads(FrugalBudgetingApplicationTests.java:36)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)

Честно говоря, я даже не знаю, что мне нужно тестировать в этом методе. Поэтому я попытался проверить учетную запись NullPointer из базы данных.

1 Ответ

0 голосов
/ 10 ноября 2019

Судя по фрагменту кода, который вы предоставили, в настоящее время вы выполняете интеграционный тест, который подключается к реальной базе данных (не видя вашего файла pom / gradle.build, я не могу сказать, какой именно, но я предположу, что H2).

Если я сохраню accountRepository.save (account), он изменит данные в базе данных (accountFromDB)?

Да, если вы сохраните учетную запись, она будет фактически вставлена ​​в тестовую базу данных.

это настоящий тест?

Да, это так. Этот тип теста называется интеграционным тестом . Другой тип теста, который я бы порекомендовал вам изучить - это юнит-тест. Хорошее объяснение модульных тестов можно найти здесь .

результат теста:

Ваш тест не был выполнен правильно, вы получаетеисключение. В вашей трассировке стека говорится, что вы где-то пытаетесь получить account.banks, но пропускаете сеанс. Чтобы исправить это, вы должны поставить @Transactional в свой метод тестирования.

@Test
@Transactional
public void contextLoads() {
....

Честно говоря, я даже не знаю, что мне нужно тестировать в этом методе. Поэтому я попытался проверить учетную запись NullPointer с базы данных.

При тестировании всегда следует задавать себе вопрос, что я пытаюсь проверить? В этом тесте вы пытаетесь проверить метод, который добавляет деньги на счет. Итак, первое, что я хотел бы проверить, это то, что учетная запись возвращается после выполнения метода (учетная запись не равна нулю). После этого я бы проверил, что баланс счета увеличивается точно на сумму, которую вы положили в метод addMoneyToBalance. Существует также еще одна вещь, которая должна быть проверена в другом тесте. И это тот случай, когда вы добавляете деньги на несуществующий аккаунт. В этом тесте вы должны утверждать, что выдается AccountNotFoundException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...