Стоит посмотреть в сторону property-based тестирования. Для JUnit, например, есть junit-quickcheck.
Также может быть полезным динамический анализ при помощи Java Pathfinder, но данный инструмент имеет ограниченное применение: не подходит для анализа программ, работающих с нативным кодом и больших по размеру (более 10 тысяч строк кода).