### Question:
CustomTokenOperation { public static CustomTokenOperation fromSMSString(String smsString) { String[] tokens = smsString.split(REGEX_PIPE); if (tokens.length != 2) { throw new IllegalArgumentException("The sms string representation of the CustomTokenOperation must be of " + "format: custom_token_name|impl_class_mame. The sms string argument: " + smsString); } return new CustomTokenOperation(tokens[0], tokens[1]); } CustomTokenOperation(String customTokenName, String customOperationClassName); String getCustomTokenName(); String getCustomOperationClassName(); @Override boolean equals(Object other); @Override int hashCode(); @Override String toString(); JsonValue toJson(); static CustomTokenOperation fromJson(JsonValue json); String toSMSString(); static CustomTokenOperation fromSMSString(String smsString);  }### Answer:
@Test public void testSMSStringMarshalling() { assertEquals(new CustomTokenOperation(CUSTOM_TOKEN_NAME, CUSTOM_TOKEN_OPERATION_IMPL), CustomTokenOperation.fromSMSString(SMS_STRING)); }
@Test(expectedExceptions = IllegalArgumentException.class) public void testInvalidSMSStringMarshalling() { CustomTokenOperation.fromSMSString(FAULTY_SMS_STRING); }