モックshimを使用したチェーンコードのテスト

このテスト方法では、スタブshim.ChaincodeStubInterfaceのモック版を使用します。これを使用して、チェーンコードをOracle Blockchain Platformにデプロイする前に、その機能をシミュレートできます。このライブラリを使用してチェーンコードのユニット・テストを構築することもできます。

チェーンコードでのshimの手動ベンダリング

これは、Oracle Blockchain Platform 19.1.1、19.1.3、19.2.1および19.2.3に適用されます。

Hyperledger Fabricでは、fabric-ccenvイメージにgithub.com/hyperledger/fabric/core/chaincode/shim (shim)パッケージが含まれています。これにより、shimを含めずにチェーンコードをパッケージ化できます。ただし、これによってHyperledger Fabricの将来のリリースで問題が発生する可能性や、shimに含まれているパッケージを使用する場合に問題が発生する可能性があります。

回避策: 潜在的な問題を回避するには、チェーンコードをパッケージ化およびインストールするためにpeerコマンドライン・インタフェースを使用する前、またはチェーンコードをパッケージ化またはインストールする前に、チェーンコードでshimパッケージを手動でベンダリングする必要があります。https://jira.hyperledger.org/browse/FAB-5177を参照してください。

モックshimを使用したチェーンコードのテスト

  1. チェーンコード・ファイルの名前に対応するテスト・ファイルを作成します。
    たとえば、car_dealer.goがスマート・コントラクトの実際の実装コードである場合、car_dealer.goのすべてのテストを含むcar_dealer_test.goというテスト・スイートを作成します。テスト・スイート・ファイル名は、*_test.go形式にする必要があります。
  2. package文およびimport文を作成します。
    package main
    
    import (
        "fmt"
        "testing"
    
        "github.com/hyperledger/fabric/core/chaincode/shim"
    )
  3. ユニット・テストを作成します。
    /*
    * TestInvokeInitVehiclePart simulates an initVehiclePart transaction on the CarDemo cahincode
     */
    func TestInvokeInitVehiclePart(t *testing.T) {
        fmt.Println("Entering TestInvokeInitVehiclePart")
    
        // Instantiate mockStub using CarDemo as the target chaincode to unit test
        stub := shim.NewMockStub("mockStub", new(CarDemo))
        if stub == nil {
            t.Fatalf("MockStub creation failed")
        }
    
        var serialNumber = "ser1234"
    
        // Here we perform a "mock invoke" to invoke the function "initVehiclePart" method with associated parameters
        // The first parameter is the function we are invoking
        result := stub.MockInvoke("001",
            [][]byte{[]byte("initVehiclePart"),
                []byte(serialNumber),
                []byte("tata"),
                []byte("1502688979"),
                []byte("airbag 2020"),
                []byte("aaimler ag / mercedes")})
    
        // We expect a shim.ok if all goes well
        if result.Status != shim.OK {
            t.Fatalf("Expected unauthorized user error to be returned")
        }
    
        // here we validate we can retrieve the vehiclePart object we just committed by serianNumber
        valAsbytes, err := stub.GetState(serialNumber)
        if err != nil {
            t.Errorf("Failed to get state for " + serialNumber)
        } else if valAsbytes == nil {
            t.Errorf("Vehicle part does not exist: " + serialNumber)
        }
    }

ノート:

スタブのすべてのインタフェースが実装されるわけではありません。スタブ関数
  • GetQueryResult

  • GetHistoryForKey

はサポートされていないため、これらのいずれかをコールしようとするとエラーになります。