Espanicon is a validator on the ICON network. Their goal is to participate in the chain governance of the network and expand the ICON ecosystem by building projects in it and collaborating with other validators.

Unit Testing

For smart contract unit testing you can use the javaee-unittest module. In the following link you can check the methods of the API for building your own tests.

For the context of a unit test on smart contracts, it is necessary to have a way to mock the contract so that we can test the functions. For this the javaee-unittest has a Service Manager that allows these types of interactions like account creation, contract deployment, etc.

For the case of this example edit the app/src/test/java/poll/contract/AppTest.java file and add the following code:

package poll.contract;

import com.iconloop.score.test.Account;
import com.iconloop.score.test.Score;
import com.iconloop.score.test.ServiceManager;
import com.iconloop.score.test.TestBase;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
import static org.junit.jupiter.api.Assertions.*;

/**
 * This class tests the Poll contract.
 * It uses the Service Manager to deploy the score and create accounts for testing.
 * It also uses the Service Manager to invoke the methods in the score.
 */
class PollTest extends TestBase {
	// Create a Service Manager for the tests
	private static final ServiceManager sm = getServiceManager();

	// Create an account for the owner of the score
	private static final Account owner = sm.createAccount();

	// Create a score for testing
	private Score score;

	/**
 	* This method is run before each test.
 	* It deploys the score with the Service Manager for testing.
 	* @throws Exception
 	*/
	@BeforeEach
	public void setup() throws Exception {
    	// Deploys the score with the Service Manager for testing
    	score = sm.deploy(owner, Poll.class);
	}

	/**
 	* This method tests the 'addVoteYes' method.
 	* It creates a 'user' and invokes the method in the score created with the Service Manager for testing.
 	* @throws Exception
 	*/
	@Test
	void appCanVoteYes() {
    	final String result = "yes";
    	var user = sm.createAccount();
    	score.invoke(user, "addVoteYes");
    	assertEquals(result, score.call(
                	"checkVote",
                	user.getAddress().toString()
                	));
	}

	/**
 	* This method tests the 'addVoteNo' method.
 	* It creates a 'user' and invokes the method in the score created with the Service Manager for testing.
 	* @throws Exception
 	*/
	@Test
	void appCanVoteNo() {
    	final String result = "no";
    	var user = sm.createAccount();
    	score.invoke(user, "addVoteNo");
    	assertEquals(result, score.call(
                	"checkVote",
                	user.getAddress().toString()
                	));
	}
}

Execute the following command for running the tests:

$ ./gradlew test

BUILD SUCCESSFUL in 504ms
3 actionable tasks: 3 up-to-date

Further Resources