Updated on 2023-03-07 GMT+08:00

Chaincode Debugging

To debug a chaincode, you can use MockStub to perform unit tests on the chaincode. To obtain the chaincode used in this section, go to the BCS console and click Use Cases. Download Chaincode_Java_Local_Demo in the Java SDK Demo area.

Adding the Dependency

To use the mock() method, add the Mockito dependency.

  • Gradle
    Add the following dependency to the dependencies block in the build.gradle file (not dependencies in the buildscript block):
    testCompile 'org.mockito:mockito-core:2.4.1'
  • Maven
    Add the following configuration dependency to the dependencies block (add the block if it does not exist) in the pom.xml file:
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>2.4.1</version>
    </dependency>

Writing Test Code

If the test folder does not exist during project creation, create it under src. Select test\java under Gradle Source Sets, and create the SimpleChaincodeTest.java test file, as shown in the following figures:

Figure 1 Creating a test file
Figure 2 Test file

The content of the SimpleChaincodeTest.java test code is as follows:

import org.hyperledger.fabric.example.SimpleChaincode;
import org.hyperledger.fabric.shim.Chaincode;
import org.hyperledger.fabric.shim.ChaincodeStub;
import org.junit.Assert;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public final class SimpleChaincodeTest {       

    @Test
    public void initTest() {         
        SimpleChaincode sc = new SimpleChaincode();
        ChaincodeStub stub = mock(ChaincodeStub.class);
        Chaincode.Response resp = sc.init(stub);
        Assert.assertEquals(resp.getStatus(), Chaincode.Response.Status.SUCCESS);
    }

    @Test
    public void insertTest() {
        SimpleChaincode sc = new SimpleChaincode();
        ChaincodeStub stub = mock(ChaincodeStub.class);
        when(stub.getFunction()).thenReturn("insert");
        List<String> args = new ArrayList<>();
        args.add("a");
        args.add("100");
        when(stub.getParameters()).thenReturn(args);
        Chaincode.Response resp = sc.invoke(stub);
        Assert.assertEquals(resp.getStatus(), Chaincode.Response.Status.SUCCESS);
    }

    @Test
    public void insertTooManyArgsTest() {
        SimpleChaincode sc = new SimpleChaincode();
        ChaincodeStub stub = mock(ChaincodeStub.class);
        when(stub.getFunction()).thenReturn("insert");
        List<String> args = new ArrayList<>();
        args.add("a");
        args.add("100");
        args.add("b");
        args.add("100");
        when(stub.getParameters()).thenReturn(args);
        Chaincode.Response resp = sc.invoke(stub);
        Assert.assertEquals(resp.getMessage(), "Incorrect number of arguments. Expecting 2");
    }

    @Test
    public void queryTest() {
        SimpleChaincode sc = new SimpleChaincode();
        ChaincodeStub stub = mock(ChaincodeStub.class);
        when(stub.getFunction()).thenReturn("query");
        List<String> args = new ArrayList<>();
        args.add("a");
        when(stub.getParameters()).thenReturn(args);
        when(stub.getStringState("a")).thenReturn("100");
        Chaincode.Response resp = sc.invoke(stub);
        Assert.assertEquals(resp.getMessage(), "100");
    }

    @Test
    public void queryNoExistTest() {
        SimpleChaincode sc = new SimpleChaincode();
        ChaincodeStub stub = mock(ChaincodeStub.class);
        when(stub.getFunction()).thenReturn("query");
        List<String> args = new ArrayList<>();
        args.add("a");
        when(stub.getParameters()).thenReturn(args);
        when(stub.getStringState("a")).thenReturn(null);
        Chaincode.Response resp = sc.invoke(stub);
        Assert.assertEquals(resp.getMessage(), "{\"Error\":\"Null val for a\"}");
    }
}

Debugging

In SimpleChaincodeTest.java, click Run Test on the left of SimpleChaincodeTest.

Figure 3 Executing the test

If the following information is displayed, the chaincode debugging is successful:

Figure 4 Successful

If the following information is displayed, the chaincode debugging failed. Edit the chaincode or check the logic of the test code based on the displayed information.

Figure 5 Failed