2017-10-30 13 views
0

私はDBとTestNGを使っていくつかの基本的な自動テストをしようとしていますが、機能しません。私が期待しているように、最初の走りは成功します。私はいくつかの例を見てきましたが、それは正しいと思われます。誰もが私が行方不明ですか知っているTestNGがテストロールバックされていない

<dependency> 
     <groupId>org.testng</groupId> 
     <artifactId>testng</artifactId> 
     <version>6.11</version> 
     <scope>test</scope> 
    </dependency> 

コード:

import com.mchange.v2.c3p0.ComboPooledDataSource; 
import java.beans.PropertyVetoException; 
import java.sql.Connection; 
import java.sql.SQLException; 
import javax.sql.DataSource; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.PropertySource; 
import org.springframework.dao.DataAccessException; 
import org.springframework.jdbc.datasource.DataSourceTransactionManager; 
import org.springframework.test.annotation.Rollback; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests; 
import org.springframework.transaction.annotation.Transactional; 
import org.testng.annotations.Test; 

@ContextConfiguration(classes = AutomatedTest.Context.class) 
public class RollbackTest extends AbstractTransactionalTestNGSpringContextTests { 


    @Test 
    @Rollback 
    @Transactional 
    public void testThing() throws Exception { 

    Class<? extends RollbackTest> c = this.getClass(); 
    String path = String.format("/%s.sql", c.getName().replaceAll("\\.", "/")); 
    super.executeSqlScript(path, false); 
    } 

    @Configuration 
    @PropertySource("db.properties") 
    static class Context { 

    @Bean 
    public DataSource dataSource(
     @Value("${datasource.url}") String url, 
     @Value("${datasource.username}") String user, 
     @Value("${datasource.password}") String pass, 
     @Value("${datasource.driver-class-name}") String driver) throws PropertyVetoException { 
     ComboPooledDataSource ds = new ComboPooledDataSource(); 
     ds.setUser(user); 
     ds.setPassword(pass); 
     ds.setJdbcUrl(url); 
     ds.setDriverClass(driver); 
     return ds; 
    } 

    @Bean 
    public Connection connection(DataSource dataSource) throws SQLException { 
     Connection c = dataSource.getConnection(); 
     System.out.println("Connection is " + c); 
     return c; 
    } 

    @Bean 
    public DataSourceTransactionManager txMan(DataSource ds) { 
     return new DataSourceTransactionManager(ds); 
    } 
    } 
} 

SQL:

CREATE SCHEMA FOO; 

CREATE TABLE FOO.BAZ (
    ID int PRIMARY KEY AUTO_INCREMENT, 
    name VARCHAR(256) NOT NULL 
); 

INSERT INTO FOO.BAZ (name) values('christian'); 

エラー:

CREATE SCHEMAのFOO

org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of class path resource [automated/RollbackTest.sql]: CREATE SCHEMA FOO; nested exception is java.sql.SQLException: Can't create database 'FOO'; database exists 
+0

'Connection'は非常に疑わしいに見える返す' @ Bean'方法。あなたは何のためにそれをしていますか? –

+0

テストメソッドの前または後にSQLスクリプトを実行するには、理想的にはSpringの '@Sql'アノテーションを調べるべきです。 –

+0

@SamBrannen以前のコードの反復で使用されていたので、私はその接続を返します - 私はそれを削除し、何が起こるかを見ます。 '@Sql'の構文 –

答えて

1

Connectionを返す@Beanメソッドは非常に疑わしいと思われます。だから私はそれを削除することをお勧めしたいと思います。

後か前に、テストメソッドをSQLスクリプトを実行するために、あなたは、理想的にはSpringの@Sql注釈になっているはずです。

また、テスト方法で@Rollback@Transactionalという宣言を安全に削除することができます。

  • @Rollbackです。
  • @Transactionalは、既にAbstractTransactionalTestNGSpringContextTestsで宣言されています。

よろしく、

サム(春TestContextフレームワーク著者)