Unit Testing
For smart contract unit testing you can use the javaee-unittest
module (opens in a new tab). In the following link you can check the methods of the API for building your own tests.
- https://www.javadoc.io/doc/foundation.icon/javaee-unittest/0.9.7/index.html (opens in a new tab)
- https://github.com/icon-project/javaee-unittest (opens in a new tab)
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
- Smart contracts in the official docs: https://docs.icon.community/icon-stack/smart-contracts (opens in a new tab)
- Java score examples: https://github.com/icon-project/java-score-examples (opens in a new tab)
- Javaee scorex: https://github.com/icon-project/javaee-scorex (opens in a new tab)
- javaee module source: https://github.com/icon-project/goloop/tree/master/javaee/api/src/java/score (opens in a new tab)
- Chain score sample: https://github.com/icon-project/goloop/blob/master/testsuite/java/foundation/icon/test/score/ChainScore.java (opens in a new tab)
- javaee api docs: https://www.javadoc.io/doc/foundation.icon/javaee-api/latest/index.html (opens in a new tab)
- javaee unittest api docs: https://www.javadoc.io/doc/foundation.icon/javaee-unittest/0.9.7/index.html (opens in a new tab)
- javaee unittest source: https://github.com/icon-project/javaee-unittest (opens in a new tab)