Массивы на основе 1 всегда должны использоваться вместо массивов на основе 0. Массивы на основе 0 являются неестественными, ненужными и подверженными ошибкам.
Когда я считаю яблоки, сотрудников или виджеты, я начинаю с одного, а не с нуля. Я учу своих детей тому же. Нет такого понятия, как 0-е яблоко или 0-й сотрудник или 0-й виджет. Использование 1 в качестве основы для массива намного более интуитивно понятно и менее подвержено ошибкам. Забудьте о плюс-один-минус-один-ад (как мы привыкли это называть). Массивы на основе 0 - это неестественная конструкция, изобретенная компьютерной наукой - они не отражают реальность, и компьютерные программы должны максимально отражать реальность.
Thanks to all the answers so far! Here's what I ended up doing as a result of recommendations from someone at work.
(I just randomly picked a free data emulator and virtual serial port package. There are plenty of alternatives out there)
Using VSPD, created virtual serial ports 24 and 25 and connected them via a virtual null modem cable. This effectively creates a write port at 24 and a read port at 25.
Ran the CPDE, connected to 24 and started writing my test data.
Ran my test program, connected to 25 and was able to read the test data from it
Общий ответ для такого рода проблем - обернуть код, который общается с COM порт в классе, реализующем интерфейс. Если вы сделаете это как фасад (шаблон), то вы также можете сделать вызываемые вами методы COM разумными со своей стороны.
Затем интерфейс можно подделать или подделать для теста. (Есть отличная статья о тестовых объектах, но мне пока не удалось ее найти.) Одним из преимуществ здесь является то, что вы можете создать поддельную версию, которая генерирует исключения или иным образом выполняет действия, которые могут выполняться портом, но трудно добиться на практике.
Там, где я работаю, мы решили аналогичную проблему, заставив наш эмулятор вообще не подделывать COM-порт. Вот как это можно сделать:
Например:
import yourpackage.InaccessibleDeviceException;
import yourpackage.NoDataAvailableException;
public interface IUsbProviderService {
public void initDevice() throws InaccessibleDeviceException;
public UsbData getUsbData()
throws InaccessibleDeviceException, NoDataAvailableException;
}
// The real service
import javax.comm.SerialPort; //....and the rest of the java comm API
public class UsbService implements IUsbProviderService {
.
.
.
}
// The emulator
public class UsbServiceEmulator implements IUsbProviderService {
private Thread listenerThread;
private static final Long WAITTIMEMS = 10L;
private String usbData;
public UsbServiceEmulator(long maxWaitTime) throws InaccessibleDeviceException{
initialize();
boolean success = false;
long slept = 0;
while (!success && slept < maxWaitTime) {
Thread.sleep(WAITTIMEMS);
slept += WAITTIMEMS;
}
}
private void initialize() throws InaccessibleDeviceException{
listenerThread = new Thread();
listenerThread.start();
}
private class UsbRunner implements Runnable {
private String[] lines = {"Data line 1", "Data line 2", "Data line 3"};
public void run() {
int line = 0;
while(true) {
serialEvent(lines[line]);
if(line == 3) {
line = 0;
} else {
line++;
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
//handle the error
}
}
private void serialEvent(String line) {
if(/*you have detected you have enough data */) {
synchronized(this) {
usbData = parser.getUsbData();
}
}
}
}
Надеюсь, это поможет!
Я рекомендую виртуальный модем fabulatech. Получите его на http://www.virtual-modem.com
Вы также можете захотеть получить монитор COM-порта для ваших тестов - Вы можете найти его на http://www.serial-port-monitor.com
Удачи с лодкой! :)
Я использую com0com , и он отлично подходит для того, что мне нужно.