How to test an exception have been logged instead of thrown?
There is no standard test feature to assert a logged message.

The simplest approach is to just install dblog in your test and then inspect the watchdog table for the expected record.

Alternatively, You could write your own log backend that stores it in memory and then access it from there if you don't want to install the necessary database tables in the test.

Or, don't use watchdog_exception() but an injected logger service that you can mock and then configure that to expect the call.