Нет результатов при использовании сохранения JPA в модульном тестировании - PullRequest
0 голосов
/ 31 октября 2018

У меня странная ситуация при выполнении какого-то юнит-тестирования. Когда я использую метод сохранения JPA, он ничего не возвращает и не выдает никакой ошибки.

@RunWith(SpringJUnit4ClassRunner.class)
@DataJpaTest
@SpringBootTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class MerchantRepoTest {

    private Long personID = 12333333l;
    @Mock
    private ABC abcRepo;
    @Mock
    private Person personRepo;
    @Autowired
    private TestEntityManager testEntityManager;
    private Gson gson = new Gson();

    @Test
    public void testPerson() {

        System.out.println("Starting................");
        Person person = new Person();

        TxnLimit txnLimit = new TxnLimit();
        txnLimit.setType("MONTHY");
        txnLimit.setValue(1000000000l);
        List<TxnLimit> txnLimits = new ArrayList<>();
        txnLimits.add(txnLimit);
        person.setTxnLimits(gson.toJson(txnLimits));

        ABC abc = new ABC();
        abc.setPersonId(personId);
        Metadata metaData = new Metadata();
        metaData.setDescription("DESC");
        metaData.setName("MUKUL");
        person.setMetadata(metaData);
        person.setId(personId);
        person.setType("Food");
        person.accountToken("hgh-hhjds-hdbhj");

        try {
            Person per1=  personRepo.save(merchant);
            ABC savedA = abcRepo.save(abc);
            Thread.sleep(1000);
            System.out.println("SAVED @@@@@@@@@@@@@@@@@@");
            System.out.println("ID1 + " + per1.getId());
            System.out.println("###############");
        }  catch (Throwable t) {
            t.printStackTrace();
        }

        Person found = personRepo.findOne(personID);
        System.out.println("FOUND..." + found);
        String name = found.getMetadata().getName();
        Assert.assertEquals(name, "MUKUL");
    }
}

Мой тестовый пример не пройден, и я получаю исключение NullPointerException в String name = found.getMetadata().getName();, так как меня обнаруживают как нулевое. Я попытался напечатать средние шаги и, к моему удивлению, что-то не так, сохраняя детали.

Я могу напечатать System.out.println("SAVED @@@@@@@@@@@@@@@@@@"); строку, но после этой строки я не получаю следующие две строки. я также не получаю никаких исключений в блоке catch . Следующее сообщение, которое я получаю на экране, - это откат транзакции.

2018-10-31 18:17:14.759 [] [] [Test worker] INFO  t.context.transaction.TransactionContext:106 - Began transaction (1) for test context [DefaultTestContext@780636f3 testClass = MerchantRepoTest, testInstance = com.paytm.paylite.merchant.repo.MerchantRepoTest@735dc46, testMethod = testOK1@MerchantRepoTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@8006101 testClass = MerchantRepoTest, locations = '{}', classes = '{class com.paytm.paylite.merchant.MerchantServiceApp}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@503407f6, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@351584c0, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@73b73c3d, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@6bc7795, [ImportsContextCustomizer@4342f78e key = [org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration, org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManagerAutoConfiguration]], org.springframework.boot.test.context.SpringBootTestContextCustomizer@67aa907e, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@50394650, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@63f5badc, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]]]; transaction manager [org.springframework.orm.jpa.JpaTransactionManager@40ec0c87]; rollback [true]
Starting................
...
...
..
SAVED @@@@@@@@@@@@@@@@@@
FOUND...null
2018-10-31 18:17:15.829 [] [] [Test worker] INFO  t.context.transaction.TransactionContext:140 - Rolled back transaction for test: [DefaultTestContext@780636f3 testClass = MerchantRepoTest, testInstance = com.paytm.paylite.merchant.repo.MerchantRepoTest@735dc46, testMethod = testOK1@MerchantRepoTest, testException = java.lang.NullPointerException, mergedContextConfiguration = [WebMergedContextConfiguration@8006101 testClass = MerchantRepoTest, locations = '{}', classes = '{class com.paytm.paylite.merchant.MerchantServiceApp}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@503407f6, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@351584c0, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@73b73c3d, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@6bc7795, [ImportsContextCustomizer@4342f78e key = [org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration, org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManagerAutoConfiguration]], org.springframework.boot.test.context.SpringBootTestContextCustomizer@67aa907e, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@50394650, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@63f5badc, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]]]

Я не могу понять, что может быть причиной этого?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Autowiring personRepo и abcRepo не будут умными в юнит-тестах, насмешка - это путь. После насмешек над этими классами вы также должны высмеивать поведение каждого используемого вами метода. Например:

Mockito.when(personRepo.save(person)).thenReturn(person);

или, если это не сработает, попробуйте:

Mockito.when(personRepo.save(person)).thenAnswer(invocationOnMock -> {
        Person p = (Person) invocationOnMock.getArguments()[0];
        p.setId(1);
        //create here object you expect to be returned by save method using setters.
        return p;
    });

Поместите эти строки перед блоком try. И Google о том, как издеваться в модульных тестах Java, вы можете найти отличные примеры и т. Д.

0 голосов
/ 31 октября 2018

Это происходит из-за того, что ваше репо осмеяно. Это означает, что его методы не вызываются. Если вы действительно хотите проверить сохранение в вашей БД, вы можете автоматически подключить personRepo и abcRepo (но вы должны делать это только для интеграционных тестов). Лучший способ для юнит-тестирования состоит в том, что вы изменяете поведение макетов на when(abcRepo.findOne(any()).thenReturn(...);. Таким образом вы будете тестировать поведение тестируемого класса, а не репо.

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