Je travaille sur une application Java de grande taille. Il dispose déjà d'un vaste cadre existant pour gérer les pilotes de périphériques. J'ai besoin de créer un nouveau pilote de périphérique pour un périphérique qui se connecte à un port série via JavaComm. Les pilotes existants créent simplement le nouveau port série dans leurs méthodes configure()
, puis créent de nouveaux flux d'entrée et de sortie à partir de l'objet port série, puis utilisent ces flux d'entrée et de sortie pour les communications de périphérique, mais sans tests unitaires. Je souhaite cependant que ma nouvelle classe soit testable à l'unité, mais je ne sais pas comment je pourrais le faire si elle devait s'intégrer à ce framework existant qui s'attend à ce que le port série, les flux d'entrée et de sortie soient configurés dans configure()
méthode.Conseils sur les tests unitaires, la classe à tester dépend du port série Java
Des idées?
public void configure()
{
super.configure();
if (isEmulated()) {
return;
}
if (isFaulty()) {
if (isOutOfService()) {
ZBopNotificationManager.getInstance().add(
new SystemNotice(SeverityCode.LEVEL3, getName(), getErrorMessage()));
}
return;
}
// ZP:
String portName = getSerialPort();
// String portName = "COM1";
try {
CommPortIdentifier id = CommPortIdentifier.getPortIdentifier(portName);
Trace.log(this, Trace.D, "Port name = " + id.getName());
port = (SerialPort) id.open(getName(), 1000);
} catch (NoSuchPortException nspe) {
report(SeverityCode.LEVEL3, getName(), "Bar Code Scanner is not connected to " + portName + " port, or the port does not exist.");
return;
} catch (PortInUseException piue) {
report(SeverityCode.LEVEL3, getName(), portName + " port is already in-use by some other device. Reason: " + piue.getMessage());
return;
}
try {
port.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {
// this should not happen
port.close();
report(SeverityCode.LEVEL2, getName(), portName + " port configuration failed: " + e);
return;
}
try {
in = port.getInputStream();
out = port.getOutputStream();
} catch (IOException ioe) {
port.close();
report(SeverityCode.LEVEL3, getName(), portName + " port configuration failed: " + ioe.getMessage());
return;
}
meout(30);
// ... other init code omitted
}
Je comprends presque. configure() doit encore créer l'adaptateur qui crée l'objet réel à utiliser et mon test d'unité doit appeler configure() pour simuler l'affichage du périphérique. Donc, je suis de retour à mon problème original d'avoir la dépendance sur le vrai port série? Cette partie, je ne comprends pas, comment tester unit() et le faire fonctionner avec le port réel dans le code de production. –
@fred: Votre test unitaire n'indiquerait pas * configure() ', il injecterait les mocks directement dans l'objet (par exemple en utilisant des méthodes setter). Seul le framework d'exécution appelait 'configure()', ce qui créait les objets de l'adaptateur, et non les moqueurs. – skaffman