В чем разница между выполнением модульного теста с @Transactional (распространение = распространение. НИКОГДА) и без @Transactional? - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть менеджер транзакций, определенный как:

@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory);
    return transactionManager;
} 

Мой репозиторий:

public interface BinMaxRepository extends Repository<String, Long> {

    @Procedure("varBinMaxTest")
    Blob getData();    
}

Моя хранимая процедура:

ALTER procedure [dbo].[varBinMaxTest]
      @binData varbinary(max) out
as
begin

  -- @binData is set to 8939 bytes
  set @binData = 0x1F8BED...

end

Мой модульный тест:

@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional(propagation = Propagation.NEVER, transactionManager="transactionManager") // If I comment out this line then an exception is thrown during testing 
public class BinMaxRepositoryTest{

    @Autowired
    private BinMaxRepository testRepo;

    @Test
    public void binMaxTest() throws SQLException {
        testRepo.getData();
    }

}

При @Transactional(propagation = Propagation.NEVER, transactionManager="transactionManager") тест интеграции проходит. Но если я закомментирую @Transactional, произойдет сбой со следующим исключением:

com.microsoft.sqlserver.jdbc.SQLServerException: The TDS protocol stream is not valid.
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:2998)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:2987)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.throwInvalidTDS(SQLServerConnection.java:2970)
...

, который, кажется, происходит от

c.m.sqlserver.jdbc.internals.TDS.Reader  : ConnectionID:1 ClientConnectionId: b56a6cd1-456d-452a-ac21-26acaa845fca got unexpected value in TDS response at offset:7992

Так что, похоже, ему не удалось получить все байты в один пакет? Я использую Spring Boot 2.2.4 и драйвер jdb c, com.microsoft.sqlserver: ms sql -jdb c: 8.2.0.jre8.

Примечание. Этот тест также работает с распространением, установленным по умолчанию, Propagation.REQUIRED, но меня интересует разница между Propagation.NEVER и отсутствием управления транзакциями в контексте теста junit 4. Я использую Eclipse 2019-09 R (4.13.0) для запуска теста.

...