I'm writing a test class for a keystore reading java class. But when I compare expected string with actual string from my test class, It gives below error.
org.opentest4j.AssertionFailedError:
<Click to see difference>
at org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:52)
at org.junit.jupiter.api.AssertEquals.failNotEqual(AssertEquals.java:197)
at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:186)
at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:181)
at org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:486)
at KeyStoreReadUtilTest.readAllCertificates(KeyStoreReadUtilTest.java:29)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:436)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:170)
at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:166)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:113)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:58)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$3(HierarchicalTestExecutor.java:112)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.executeRecursively(HierarchicalTestExecutor.java:108)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.execute(HierarchicalTestExecutor.java:79)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$2(HierarchicalTestExecutor.java:120)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$3(HierarchicalTestExecutor.java:120)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.executeRecursively(HierarchicalTestExecutor.java:108)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.execute(HierarchicalTestExecutor.java:79)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$2(HierarchicalTestExecutor.java:120)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$3(HierarchicalTestExecutor.java:120)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.executeRecursively(HierarchicalTestExecutor.java:108)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor$NodeExecutor.execute(HierarchicalTestExecutor.java:79)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:55)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:43)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
I'm using IntelliJ IDEA Community Edition and when I click the "Click to see difference" link in above error it says both strings are identical. When I checked 2 strings in "https://www.diffchecker.com/" online tool, it also says that both string are same. Still I find a solution for this error. Below I included my KeyStore read class.
package util;
import java.io.File;
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.util.Base64;
import java.util.Enumeration;
public class KeyStoreReadUtil {
private FileInputStream fileInputStream;
private KeyStore keystore;
private Enumeration enumeration;
private String certificatePrefix;
private String certificatePostfix;
public KeyStoreReadUtil(File inputKeystoreFile, String keystorePassword) throws Exception {
fileInputStream = new FileInputStream(inputKeystoreFile);
char[] keystorePasswordAsCharArray = keystorePassword.toCharArray();
keystore = KeyStore.getInstance("PKCS12");
keystore.load(fileInputStream, keystorePasswordAsCharArray);
enumeration = keystore.aliases();
certificatePrefix = "\n==============================BEGIN CERTIFICATE==============================";
certificatePostfix = "\n===============================END CERTIFICATE==============================\n";
}
public String readCertificates() throws Exception{
String readings = "";
while (enumeration.hasMoreElements()){
String alias = (String) enumeration.nextElement();
readings += readCertificates(alias);
}
return readings;
}
public String readCertificates(String alias) throws Exception{
Certificate certificate = keystore.getCertificate(alias);
byte[] encodedCertificateKey = certificate.getEncoded();
String b64CertificateKey = "\nAlias:\t" + alias + "\n" + Base64.getMimeEncoder().encodeToString(encodedCertificateKey);
String certificateKeyString = certificatePrefix + b64CertificateKey + certificatePostfix;
return certificateKeyString;
}
}
Below I included my test class.
import org.junit.jupiter.api.Test;
import util.KeyStoreReadUtil;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.apache.commons.codec.digest.DigestUtils;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class KeyStoreReadUtilTest {
private KeyStoreReadUtil keyStoreReadUtil;
private KeyStoreReadUtilTest() throws Exception{
File keystoreFile = new File("src/test/java/testKeystore.p12");
keyStoreReadUtil = new KeyStoreReadUtil(keystoreFile, "pass123");
}
@Test
void readAllCertificates() throws Exception{
String resultString = keyStoreReadUtil.readCertificates();
String result = DigestUtils.sha1Hex(resultString);
Path expectedResultFile = Paths.get("src/test/java/readAllCertificatesExpected.txt");
String expectedString = Files.readString(expectedResultFile);
String expected = DigestUtils.sha1Hex(expectedString);
// assertEquals(expected, result);
assertEquals(expectedString, resultString);
}
}
In test class I take expected result from a .txt file. Below I included content of that text file.
==============================BEGIN CERTIFICATE==============================
Alias: sftpkey
MIIDfzCCAmegAwIBAgIEeSu3RDANBgkqhkiG9w0BAQsFADBwMQswCQYDVQQGEwJMSzELMAkGA1UE
CBMCV1AxEDAOBgNVBAcTB0NvbG9tYm8xGjAYBgNVBAoTEUNyZWF0aXZlIFNvZnR3YXJlMQ8wDQYD
VQQLEwZQYWdlcm8xFTATBgNVBAMMDER1c2h5YW50aGFfMzAeFw0xOTA5MzAwNDA5NDFaFw0xOTEy
MjkwNDA5NDFaMHAxCzAJBgNVBAYTAkxLMQswCQYDVQQIEwJXUDEQMA4GA1UEBxMHQ29sb21ibzEa
MBgGA1UEChMRQ3JlYXRpdmUgU29mdHdhcmUxDzANBgNVBAsTBlBhZ2VybzEVMBMGA1UEAwwMRHVz
aHlhbnRoYV8zMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4IdzRnOkZOErqr2WJCRo
OSKhtDLRvGn4zhT/+b53aYsL8vC9ItLSWdgQ4Jb3Gup6clU7/+gKl553BuDe/2Ckym4RRdtwqNH4
BW2mv6hLVu7SdUaOyYvh8wQuBv1BFXRj1Lg0+q6r9+qNfnGglAy7WYTKUQdppnm9PnC6zETzNBao
dN2Ks+kvrj9yU6zenlHxXkCYIFOjWYGTsZ0ny7MY3d0cTyKocNqpnMXjB9n2RDSP9LNIj5p1km8R
Sf47wyV69EaQm0R8NToIvt2aDqs6hlomovlhrwac52R2nW06xZ2ek99lusXHh9Fb3wN3lRhUt42i
xAzh9jowHKr6UWYBOwIDAQABoyEwHzAdBgNVHQ4EFgQUDZ53d6xHv0RvbLXQnuJub+EtX6EwDQYJ
KoZIhvcNAQELBQADggEBAC39tfBpRu6Y70njXAB2CCR8+zet6BE2zkM+7vkWFgViV6Emf20fcRcx
B4AAa0juydCgC/MofrwSqm7QvNoNEp3XNWCH1eSBmv5zJmItzTHtgpAJiF76BoEWB8A+HkCMNOxw
//iuomJ5xNFPtZtHhi2CvMG6Bp7O6XEf5guIDxjOpQ4bxxJ2sBJUye5FnXe44+CHsMfuUVVOb6js
yQsQmd9d5QQM6HHkrx1YifZ/b9t1E35jPnc+TVcEYYe8je+c796l27b18k6IeaFeIu+8uPakm1bm
qWTydlTXkY2/RVcM0R+Q0AvPRl50vP6z1gePj9N+GogDi0u0OMKg/C7kg48=
===============================END CERTIFICATE==============================
==============================BEGIN CERTIFICATE==============================
Alias: baeldung
MIIDPjCCAiagAwIBAgIJAPvd1gx14C3CMA0GCSqGSIb3DQEBBQUAMEcxCzAJBgNVBAYTAk1BMRAw
DgYDVQQIEwdNb3JvY2NvMRMwEQYDVQQHEwpDYXNhYmxhbmNhMREwDwYDVQQDEwhCYWVsZHVuZzAe
Fw0xNzEwMTIxMDQzMTRaFw0yNzEwMTMxMDQzMTRaMEcxCzAJBgNVBAYTAk1BMRAwDgYDVQQIEwdN
b3JvY2NvMRMwEQYDVQQHEwpDYXNhYmxhbmNhMREwDwYDVQQDEwhCYWVsZHVuZzCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAMyi5GmOeN4QaH/CP5gSOyHX8znb5TDHWV8wc+ZT7kNU8zt5
tGMhjozK6hax155/6tOsBDR0rSYBhL+Dm/+uCVS7qOlRHhf6cNGtzGF1gnNJB2WjI8oMAYm24xpL
j1WphKUwKrn3nTMPnQup5OoNAMYl99flANrRYVjjxrLQvDZDUio6IujrCZ2TtXGM0g/gP++28KT7
g1KlUui3xtB0u33wx7UN8Fix3JmjOaPHGwxGpwP3VGSjfs8cuhqVwRQaZpCOoHU/P8wpXKw80sSd
hz+SRueMPtVYqK0CiLL5/O0h0Y3le4IVwhgg3KG1iTGOWn60UMFn1EYmQ18k5Nsma6UCAwEAAaMt
MCswCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBPAwCwYDVR0PBAQDAgUgMA0GCSqGSIb3DQEB
BQUAA4IBAQC8DDBmJ3p4xytxBiE0s4p1715WT6Dm/QJHp0XC0hkSoyZKDh+XVmrzm+J3SiW1vpsw
b5hLgPo040YX9jnDmgOD+TpleTuKHxZRYj92UYWmdjkWLVtFMcvOh+gxBiAPpHIqZsqo8lfcyAuh
8Jx834IXbknfCUtERDLG/rU9P/3XJhrM2GC5qPQznrW4EYhUCGPyIJXmvATMVvXMWCtfogAL+n42
vjYXQXZoAWomHhLHoNbSJUErnNdWDOh4WoJtXJCxA6U5LSBplqb3wB2hUTqw+0admKltvmy+KA1P
D7OxoGiY7V544zeGqJam1qxUia7y5BL6uOa/4ShSV8pcJDYz
===============================END CERTIFICATE==============================