簡體   English   中英

使用mockobjects進行Junit測試

[英]Junit testing using mockobjects

我試圖在第一種情況下測試我的測試失敗,而我知道我的代碼工作:

import org.junit.*;
import static org.junit.Assert.*;

import java.sql.Connection;
import java.sql.SQLException;

public class TestGetConnection {
@Test
    public void getConnection() throws SQLException{
    GetConnection getCon = new GetConnection();
    Connection con = getCon.getConnection();
    assertEquals("com.mysql.cj.jdbc.ConnectionImpl@3aa9e816",con.toString());

}
}

這是GetConnectionclass:

package BE.Intec.Daniel.BabySteps;

import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Scanner;

public class GetConnection {
    private String url2 = "jdbc:mysql://";
    private String url;
    private String user;
    private String timezone = "?useUnicode=true&use  JDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=CET";
    private String password;
    private Scanner input = new Scanner(System.in);

public GetConnection() {
    System.out.println("Geef het adres zonder http:// of www. van de database in aub.");
    url2 += input.nextLine();
    url = url2 + timezone;
    System.out.println("Geef de username in aub.");
    user = input.nextLine();
    System.out.println("Geef het paswoord in aub.");
    password = input.nextLine();

}

public String setUrl(String dbName) {
    url2 += dbName;
    return url = url2 + timezone;
}

public java.sql.Connection getConnection() throws SQLException {
    return DriverManager.getConnection(url, user, password);
    }
}

在第二個測試中,我首先使用一個模擬對象來獲取連接,但不知何故,在嘗試創建數據庫之前,之前的dos不會被激活。

package BE.Intec.Daniel.BabySteps;

import static org.junit.Assert.*;

import java.sql.Connection;
import java.sql.SQLException;

import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;

public class TestCreateDatabase {
    private Connection con;
    @Before
    public void init() throws SQLException{
        GetConnection getcon = EasyMock.createMock(GetConnection.class);
        con = getcon.getConnection();
    }

    @Test
    public void createDatabase(){   
        CreateDataBase newDb = new CreateDataBase(con); 
        String result = newDb.createDataBase();
        assertEquals("Uw databse werd succesvol gecreëerd",result);
        }
   }

這是CreateDatabaseclass:

package BE.Intec.Daniel.BabySteps;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Scanner;
import com.mysql.cj.api.jdbc.Statement;

public class CreateDataBase {
private Connection con;
private java.sql.Statement stat;
private String databaseName;

public CreateDataBase(Connection con) {
    this.con = con;
    createDataBase();
}

public String createDataBase() {
    Scanner in = new Scanner(System.in);
    System.out.println("Hoe moet uw database noemen?");
    databaseName = in.nextLine();
    String succes = "";
    try {
        stat = con.createStatement();
        String statement = "CREATE DATABASE IF NOT EXISTS " + databaseName;
        stat.executeUpdate(statement);
        succes ="Uw databse werd succesvol gecreëerd";
    } catch (SQLException e) {
        System.out.println("Er ging iets fout");
        e.printStackTrace();
    }
    return succes;
}

public String getDatabaseName() {
    return databaseName;
}

}

Anny想法為什么我的測試失敗了? Anny的幫助會很大程度上的幫助。不要介意我的英語,我是比利時人,所以不是本地的。

第一次測試是技術測試。 您想檢查驅動程序是否配置正確。

您應該使用您要測試的值(url,用戶名,密碼)將scanner.nextLine()返回的String值存根。
此外,您不應在assertEquals()方法中檢查"com.mysql.cj.jdbc.ConnectionImpl@3aa9e816" 依賴於Object類中的默認toString()方法來斷言結果是一個壞主意,因為它在其表示中包含對象的哈希碼( @... part),這不是比較內容的正確方法。
這應該足夠了:

Assert.assertTrue(con.toString().contains("com.mysql.cj.jdbc.ConnectionImpl"));

這是更新的測試方法:

@Test
public void getConnection() throws SQLException {
    String input = "urlToTest\nuser\nvalue";
    InputStream in = new ByteArrayInputStream(input.getBytes());
    System.setIn(in);
    GetConnection getCon = new GetConnection();
    Connection con = getCon.getConnection();
    Assert.assertTrue(con.toString().contains("com.mysql.cj.jdbc.ConnectionImpl"));
}

對於第二個測試,你應該更喜歡Mockito而不是EasyMock,它更容易,有效,靈活且功能強大。 此外,使用的測試邏輯不正確。
在這里,您可以模擬GetConnection對象,但是在調用方法時,您不指定模擬對象應該執行的操作:

@Before
public void init() throws SQLException{
    GetConnection getcon = EasyMock.createMock(GetConnection.class);
    con = getcon.getConnection();
}

無論如何嘲笑這可能不是最好的選擇。
CreateDataBase類執行數據庫創建。
如果你想測試它,你應該通過集成(即真實數據庫。為什么不在內存數據庫中)而不是使用模擬來測試它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM